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

sizeof(struct) weird output in C++

本文关键字:输出 C++ struct sizeof      更新时间:2023-10-16

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

#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号楼的大小是多少?

这是内存对齐。

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

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

因为结构填充(也称为内存对齐)。对齐必须是二次方(C11在6.2.8p4中明确说明了这一点,如@KeithThompson所述),因为您的结构的总大小是5,所以4的最近倍数是8,所以它给出8,这也是因为对齐必须是2次方。

您可以使用#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 *)时它没有用处。

点击此处阅读更多