C语言中结构体(struct)的对齐方式

C语言中结构体(struct)的对齐方式

编码文章call10242025-01-24 9:11:1010A+A-

了解结构体(struct)的对齐方式,才能更加有效地的设计和布局结构体。使之更加紧凑,相应的运行速度也会提高。

这里有一个结合使用 _Alignof 和 sizeof 的实际示例。这个示例展示了定义一个结构体,并检查结构体及其成员的大小和对齐要求。

#include <stdio.h>
#include <stdalign.h>

struct MyStruct {
    char c;
    int i;
    double d;
};

int main() {
    struct MyStruct s;

    printf("MyStruct 的大小: %zu 字节\n", sizeof(struct MyStruct));
    printf("MyStruct 的对齐要求: %zu 字节\n", _Alignof(struct MyStruct));

    printf("char 的大小: %zu 字节\n", sizeof(char));
    printf("char 的对齐要求: %zu 字节\n", _Alignof(char));

    printf("int 的大小: %zu 字节\n", sizeof(int));
    printf("int 的对齐要求: %zu 字节\n", _Alignof(int));

    printf("double 的大小: %zu 字节\n", sizeof(double));
    printf("double 的对齐要求: %zu 字节\n", _Alignof(double));

    printf("MyStruct 中 c 的偏移量: %zu 字节\n", offsetof(struct MyStruct, c));
    printf("MyStruct 中 i 的偏移量: %zu 字节\n", offsetof(struct MyStruct, i));
    printf("MyStruct 中 d 的偏移量: %zu 字节\n", offsetof(struct MyStruct, d));

    return 0;
}

解释

  • MyStruct 的大小: 结构体的总大小。
  • MyStruct 的对齐要求: 结构体的对齐要求。
  • char、int 和 double 的大小和对齐要求: 结构体各成员的大小和对齐要求。

成员的偏移量: 每个成员在结构体中的偏移量,显示编译器如何安排它们以满足对齐要求。

运行此代码可能会产生如下输出,具体取决于您的系统:

MyStruct 的大小: 16 字节
MyStruct 的对齐要求: 8 字节

char 的大小: 1 字节
char 的对齐要求: 1 字节

int 的大小: 4 字节
int 的对齐要求: 4 字节

double 的大小: 8 字节
double 的对齐要求: 8 字节

MyStruct 中 c 的偏移量: 0 字节
MyStruct 中 i 的偏移量: 4 字节
MyStruct 中 d 的偏移量: 8 字节

输出解释

  • MyStruct 的大小: 16 字节

这显示了结构体的总大小,考虑了其成员的对齐要求。

  • MyStruct 的对齐要求: 8 字节

结构体的对齐要求由其最严格对齐的成员决定,即 double,需要 8 字节。

成员的偏移量

  • c 的偏移量: 0 字节

char 成员放在开头。

  • i 的偏移量: 4 字节

int 成员放在偏移量 4 处,以满足其 4 字节的对齐要求。

  • d 的偏移量: 8 字节

double 成员放在偏移量 8 处,以满足其 8 字节的对齐要求。

这个示例展示了如何使用 sizeof 和 _Alignof 来理解 C 语言中的内存布局和对齐要求,这对于性能优化和避免与对齐相关的问题至关重要

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4