一个类的大小

class A
{
    double a;
    short b;
    int c;
    char d;
}

请问sizeof(A)的大小是多少?对齐的原则是什么

阅读 3.4k
2 个回答

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
{

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.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倍数。爪机没试验过

1 篇内容引用
推荐问题
宣传栏