class A { double a; short b; int c; char d; }
请问sizeof(A)的大小是多少?对齐的原则是什么
ringa_lee
sizeof(A)==24
double a: sizeof(double) == 8short b 本来占2,因为后面int c占4,它要跟c对齐,b也变成占4, (b和c加起来刚好占8,与占用最长的double a刚好对齐)char d与最大的double a对齐占8。
所以了解了对齐的一些原则后,可以通过调整成员的声明顺序来节省空间,比如把A改成:class A{
double a; char d; short b; int c;
};sizeof(A) == 16,因为d跟b对齐,占2,而d(2) b(2) c(4)刚好为8,对齐a,所以刚好占用了16,对前一种定义少了8。
关于“数据结构对齐”的原则,不是三言两语就能表述清楚的,你可以用“C Data structure alignment”或“C Data structure padding”搜索一下,会有一大堆的文章出来。
补充说明:以上说的是通常情况下(即不修改编译器编译行为的情况)的对齐方式,但也可以告诉编译器使用多少个字节来进行对齐,比如在A声明前面加上一句:
#pragma pack(4)
这样会让编译器以4字节,而不是结构中的占用最长的成员(double a)进行对齐,如果以4字节的方式来对齐的话,sizeof(A) == 20。
对于gcc编译器,还可以用
__attribute((aligned (n)))
来设置按n字节对齐。
如果你原题所在的机器上没有开启这两个设置,那可能你的编译器就是默认使用4字节对齐的,你验证一下。
参考链接:http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.htmlhttp://blog.csdn.net/edonlii/article/details/12748903
不同编译环境的对齐方式略有不同,g 常用的规则是成员偏移必须整除自身大小,double大小8,偏移0没问题,short大小2偏移8,int大小4,如果偏移10就不对了,故c的偏移是12,接下来short大小1偏移16,这样一共是17字节,考虑到32位机器单次处理4字节,于是补3个字节凑成20字节为4倍数。估计64位就是24字节凑8倍数。爪机没试验过
sizeof(A)==24
double a: sizeof(double) == 8
short b 本来占2,因为后面int c占4,它要跟c对齐,b也变成占4, (b和c加起来刚好占8,与占用最长的double a刚好对齐)
char d与最大的double a对齐占8。
所以了解了对齐的一些原则后,可以通过调整成员的声明顺序来节省空间,比如把A改成:
class A
{
};
sizeof(A) == 16,因为
d跟b对齐,占2,而d(2) b(2) c(4)刚好为8,对齐a,所以刚好占用了16,对前一种定义少了8。
关于“数据结构对齐”的原则,不是三言两语就能表述清楚的,你可以用“C Data structure alignment”或“C Data structure padding”搜索一下,会有一大堆的文章出来。
补充说明:
以上说的是通常情况下(即不修改编译器编译行为的情况)的对齐方式,但也可以告诉编译器使用多少个字节来进行对齐,比如在A声明前面加上一句:
这样会让编译器以4字节,而不是结构中的占用最长的成员(double a)进行对齐,如果以4字节的方式来对齐的话,sizeof(A) == 20。
对于gcc编译器,还可以用
来设置按n字节对齐。
如果你原题所在的机器上没有开启这两个设置,那可能你的编译器就是默认使用4字节对齐的,你验证一下。
参考链接:
http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html
http://blog.csdn.net/edonlii/article/details/12748903
不同编译环境的对齐方式略有不同,g 常用的规则是成员偏移必须整除自身大小,double大小8,偏移0没问题,short大小2偏移8,int大小4,如果偏移10就不对了,故c的偏移是12,接下来short大小1偏移16,这样一共是17字节,考虑到32位机器单次处理4字节,于是补3个字节凑成20字节为4倍数。估计64位就是24字节凑8倍数。爪机没试验过