关于c ++:为什么sizeof为char显示4个字节?


Why does sizeof show 4 bytes for a char?

本问题已经有最佳答案,请猛点这里访问。

所以我现在是一名学生,正在学习编程课程。

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

我觉得很奇怪的例子之一是:

1
2
3
4
5
6
7
class TwoIntAndACharClass
{
public:
    int x_;
    int y_;
    char z_;
};

以及测试它的部分

1
2
3
TwoIntAndACharClass o3b;
cout <<"Sizeof TwoIntAndACharClass          =" <<  sizeof(o3b) <<"
"
;

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

所以首先我觉得这很奇怪,但过了一段时间我得出结论,它可能会节省一些4字节的块。

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

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

所以我的问题是,我的最后一个理论是真的吗?或者是其他的原因使得这个角色需要更多的记忆?(我的老师确实说过每个编译器都可以用不同的方式处理这个问题,但我在Microsoft Visual Studio上尝试过,一个朋友在另一个编译器上尝试过,结果相同,但这真的是这样吗,编译器处理这个问题的方式是这样的吗?)

抱歉我的英语不好。


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

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