有人可以解释一下这段代码的输出吗?
#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的大小如何?
答案 0 :(得分:4)
这是内存对齐。
struct Yo{
char sex; // Takes up 1 byte + 3 for padding
int a; // Takes up 4 bytes
};
不会使用sex
和a
之间的三个字节,因为编译器会将它们对齐以获得更好的性能。因此,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