所以我现在是一名学生,正在接受编程工作。
今天我们讨论了在不同类中使用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字节)和double(也是8字节)
所以我的问题是,我的最后一个理论是真的 - 或者它是否有所不同使得char需要更多的内存然后需要? (我的老师确实说过,每个编译器都能以不同的方式处理这个问题,但是我已经在microsoft visual studio上尝试过了,而且朋友在另一个编译器上尝试了相同的结果,但这是真的,它是编译器处理它的方式吗?)
抱歉我的英语很差。
答案 0 :(得分:7)
sizeof
为您提供结构的大小,而不是其成员大小的总和。由于对齐要求(int
通常喜欢在自然边界上对齐;大多数平台上有4个字节),编译器会将结构填充到12个字节,这样当你有多个struct的实例相邻时其他(例如在数组中),它们保持正确对齐。
大多数编译器都有一些自定义扩展来控制填充,例如Microsoft编译器中的#pragma pack
。