ホームページ  >  に質問  >  本文

c++ - 一个类的大小

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

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

ringa_leeringa_lee2714日前773

全員に返信(2)返信します

  • 阿神

    阿神2017-04-17 12:04:23

    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

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 12:04:23

    不同编译环境的对齐方式略有不同,g++常用的规则是成员偏移必须整除自身大小,double大小8,偏移0没问题,short大小2偏移8,int大小4,如果偏移10就不对了,故c的偏移是12,接下来short大小1偏移16,这样一共是17字节,考虑到32位机器单次处理4字节,于是补3个字节凑成20字节为4倍数。估计64位就是24字节凑8倍数。爪机没试验过

    返事
    0
  • キャンセル返事