为什么这个工会的规模比预期的大?

Ash*_*man 6 c

当我输入以下代码时,得到的结果是32个字节。它应该是28个字节。为什么我得到那个结果?

//size of union variable

union U {
    int x[7];
    double y[3];
}z;

int main(){
    printf("%d",sizeof(z));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

mol*_*ilo 10

像结构一样,对工会进行填充以同意其成员的所需对齐方式。

double 在您的平台上以8的倍数对齐,而32是8的最小倍数,即至少28。

  • 这个答案应该加上为什么重要(即在数组中使用)。 (3认同)
  • @akshaykishore这是一个工会。 (2认同)
  • @CaitLANJenner但要小心。[正在写入的`struct`的填充字节可以更新](https://port70.net/~nsz/c/c11/n1570.html#6.2.6.1p6):“当值存储在具有结构或联合类型的对象,包括在成员对象中,**与任何填充字节相对应的对象表示形式的字节采用未指定的值**。” 在这种情况下,在示例联合中将值分配给y [2]可能会更改x [6]的值。诚然,直接给自己分配struct值时,这仅可能发生。 (2认同)

ryy*_*ker 5

正如另一个答案中所解释的,填充用于促进结构(和联合)成员对齐,这也是您看到意外大小的原因。

要查看您期望的大小(即没有填充),您可以使用语句强制代码忽略pragma对齐问题。 #pragma pack具体用于向编译器指示struct/union以特定方式打包,通过将寻址对齐从默认值更改为其他值。

以下结果的大小为 28:

#pragma pack(1) //Sets compiler to align on 1 byte address boundaries
                //(Effectively removing all padding)

union U {
    int x[7];
    double y[3];
}z;

#pragma pack() //Set packing back to what it was before

int main(){
    printf("%d",sizeof(z));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)