主要参考这篇博文,总结成下面几点:
1. 根据操作系统及编译器不同有不同的对齐方式,代码中C的大小在mac下是16,在windows下是24;
2. 除了int a:2这种类型的变量,其他变量存放的起始位置都是该变量的整数倍,包括该结构题的初始化内存地址;
3. 由于上面这条规则,因此struct的大小是内部最大变量的整数倍;
4. struct的嵌套可能被编译器优化成在一个struct中的情况;
5. C和D的大小不一样,所以当int a:2以及int b:2这种相同类型的放在一起,可能直接被编译器优化成了int _a_b:4。
#include <cstdio> struct B { char a[3]; }; struct A { /* int a; //int b:20; //int c:5; double d; */ B e; char b; }; struct C { int i:8; char j:4; int a:4; double b; };
struct D {
int i:8;
int a:4;
char j:4;
double b;
}; int main() { /* A *a = new A(); unsigned long int add = (unsigned long int)a; int size = (int)sizeof(A); if (add % size == 0) { printf("yes\n"); } else { printf("no\n"); } */ // printf("%d %d\n", (int)sizeof(A), (int)sizeof(B)); printf("%d\n", (int)sizeof(C)); }