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