C语言中结构体(struct)的对齐方式
了解结构体(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 语言中的内存布局和对齐要求,这对于性能优化和避免与对齐相关的问题至关重要。
下一篇:嵌入式C语言之——结构体对齐详解