sizeof(struct)C ++中的奇怪输出

时间:2014-01-13 16:45:12

标签: c++ struct structure structure-packing

有人可以解释一下这段代码的输出吗?

#include <iostream>
using namespace std;

struct Yo{
    char sex;
    int a;
};

int main() {
    Yo c;
    cout<<sizeof(c.sex);
    cout<<endl<<sizeof(c.a);
    cout<<endl<<sizeof(c);
    return 0;
}

输出:1 4 8

结构8的大小如何?

2 个答案:

答案 0 :(得分:4)

这是内存对齐。

struct Yo{
    char sex;   // Takes up 1 byte + 3 for padding
    int a;      // Takes up 4 bytes
};

不会使用sexa之间的三个字节,因为编译器会将它们对齐以获得更好的性能。因此,sex最终使用1个字节的空间,并将成员变量之后的三个字节用作填充,以确保int a具有4的地址倍数(对齐4个字节)。

答案 1 :(得分:1)

由于结构填充(也称为内存对齐)。对齐必须是2的幂(C11在6.2.8p4中明确表示如@KeithThompson所述)并且因为你的结构的总大小是5,4的最接近的倍数是8所以它给出8,也是因为对齐必须是两个人的力量。

您可以使用#pragma pack来确定尺寸。

#pragma pack(push, 1) /* set alignment to 1 byte boundary */
struct A {
    char s;
    int a;
};
#pragma pack(pop) // restore to default

警告: #pragma pack不在标准C中,也不假设结构需要4字节对齐。正如@KeithThompson所说。

“类型的大小必须是其对齐的倍数,但大小不必是2的幂。例如,假设4字节的int,像struct { int a, b; char d; }这样的结构可能会有对齐4和大小12.大小是对齐的最接近的倍数,而不是最接近的2的幂。“ - @KeithThompson

打包对于减少内存很有用,当你有一个充满整数的结构,固定的字符长度等时使用它。我不知道使用指针是否合适但是在使用指针时看不到它有用(例如结构中的void *

了解更多here