C++计算结构体大小问题

#include <iostream>
using namespace std;
#pragma pack(1)
struct node{
    int a : 4;
};
int main() {
    cout << sizeof(node) << endl;
}

输出为1,但是这里位域的类型是int,分配4个字节,所以结果不应该是4吗,其实只要把pack(1)改成pack(4),输出结果就是4了,这是为什么呢?

刚刚实际运行了下,都是占用的4个字节

【以下回答由 GPT 生成】

问题的原因在于#pragma pack(n)指令会改变结构体成员在内存中的对齐方式。在这个问题中,当指令#pragma pack(1)被使用时,会将结构体的对齐方式设置为1字节,即每个成员都将按1字节进行对齐。

由于int a : 4;是一个位域变量,表示a占用的位数为4位。然而,由于对齐方式被设置为1字节,在存储这个位域变量时,它会占用一个字节的空间。这是因为字节是内存分配的最小单元,不能再细分为位。于是,这个位域变量将被分配到一个字节的空间中,无论实际需要的空间是多少。

因此,尽管int a : 4;只需要4位的空间,但由于对齐方式的改变,它实际上占用了1字节的空间。所以,sizeof(node)的结果是1。

要得到预期的输出结果4,可以将#pragma pack(1)指令删除。这样,结构体将按默认的对齐方式进行对齐,int a : 4;将被正确地分配为4位的空间,sizeof(node)的结果将是4。以下是修改后的代码:

#include <iostream>
using namespace std;

struct node {
    int a : 4;
};

int main() {
    cout << sizeof(node) << endl;
}

输出结果将会是4。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^