84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
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倍数。爪机没试验过