struct hack - 零大小的数组

Ele*_*rix 6 c++ struct g++ sizeof

#include <iostream>
using namespace std;

struct node1{
    char b[3];
    int c[0];
};

struct node2{
    int c[0];
};

struct node3{
    char b[3];
};


int main() {

    cout << sizeof(node1) << endl;  // prints 4
    cout << sizeof(node2) << endl;  // prints 0
    cout << sizeof(node3) << endl;  // prints 3
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么编译器为node2中的int c [0]分配0个字节,但为node1的一部分分配1个字节.我假设这个1字节是sizeof(node1)返回4的原因,因为没有它(如在node3中)它的大小是3或者是由于填充?

还试图理解不应该node2有足够的空间来容纳一个指向数组的指针(作为灵活的数组/结构黑客的一部分,它将在代码中进一步分配?

cad*_*luk 0

c不分配 1 个字节node1。这是因为添加了填充b

对于b,为了便于 32 位 CPU 获取,它的大小为 4 个字节。32位CPU一次可以从内存中读取4个连续字节。要读三篇,他们必须读四篇,然后删除不需要的一篇。因此,为了优化此行为,编译器用struct一些字节填充。

当值被压入堆栈时(即分配参数或局部变量),您可以观察到类似的编译器优化。堆栈始终与 CPU 的数据总线大小(通常为 32 或 64 位)保持一致。

  • @MatsPetersson 是的,我明白,但这不是答案所说的。答案是“b”有四个字节大,以便于轻松获取。这不是原因:一切都与“c”有关。 (2认同)