标签:
结构体对齐规则:
(1)第一个成员在与结构体变量偏移量为0处
(2)其他成员变量需要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
VS中默认为8
(3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍
(4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
#include <stdio.h> #include <stddef.h> struct A { double a; char c; char d; }; struct B { char c; int a; char d; }; //在D中声明一个A的成员 struct D { int i; double d; char c; struct A a; }; //在AA中嵌套一个BB struct AA { int a; double d; struct BB { int bb; double dd; }; char c; }; struct DD { int a; double d; int bb; double dd; char c; }; int main() { struct A sa; printf("%p\n", &(sa.a)); printf("%p\n", &sa); printf("sizeof(A) = %d\n", sizeof(struct A)); printf("sizeof(B) = %d\n", sizeof(struct B)); printf("sizeof(D) = %d\n", sizeof(struct D)); printf("sizeof(AA) = %d\n", sizeof(struct AA)); printf("sizeof(DD) = %d\n", sizeof(struct DD)); printf("i:%d\n", offsetof(struct D, i)); printf("d:%d\n", offsetof(struct D, d)); printf("c:%d\n", offsetof(struct D, c)); printf("a:%d\n", offsetof(struct D, a)); return 0; }
标签:
原文地址:http://blog.csdn.net/lolita0917/article/details/45697619