-2

所以我目前是一名学生,并且有一个编程课程。

今天我们讨论了 sizeof 在不同类中的使用(如果它有 1 个 int 或 2 个 int 等等)

我发现奇怪的示例的一部分是这样的:

class TwoIntAndACharClass
{
public:
    int x_;
    int y_;
    char z_;
};

和测试它的部分

TwoIntAndACharClass o3b;
cout << "Sizeof TwoIntAndACharClass          = " <<  sizeof(o3b) << "\n";

所以在程序中我可以看到一个有 1 个字符的类占用了 1 个字节。所以当我看到这个时,我以为我会看到 9 个字节而不是 12个字节

所以一开始我觉得这很奇怪,但一段时间后我得出结论,它可能会节省某种 4 字节的块。

为了 100% 确定这是真的,我尝试在类中添加一个新变量(一个 8 字节的双精度变量),总大小从 12 字节增加到现在的 24 字节。那就是 char 现在必须是 8 个字节长,所以我的最后一个理论失败了。

我的最后一个理论是,它将采用已声明的最大变量并将其大小用于 char 变量 _z ,因为这适用于 long long int(8 bytes) 和 double(also 8 bytes)

所以我的问题是,我的最后一个理论是正确的 - 还是让 char 占用更多内存而不是需要的东西?(我的老师确实说过每个编译器可以以不同的方式处理这个问题,但我已经在 microsoft Visual Studio 上尝试过,一个朋友在另一个编译器上尝试过,结果相同,但这是真的吗,是编译器处理这个问题的方式吗?)

对不起我糟糕的英语。

4

1 回答 1

7

sizeof为您提供结构的大小,而不是其成员大小的总和。由于对齐要求(ints 通常喜欢在自然边界上对齐;在大多数平台上为 4 个字节),编译器会将结构填充到 12 个字节,以便当您有多个彼此相邻的结构实例时(例如,在数组),它们保持正确对齐。

大多数编译器都有一些自定义扩展来控制填充,例如#pragma pack在微软的编译器中。

于 2013-08-26T16:09:28.490 回答