当我输入以下代码时,得到的结果是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。
正如另一个答案中所解释的,填充用于促进结构(和联合)成员对齐,这也是您看到意外大小的原因。
要查看您期望的大小(即没有填充),您可以使用语句强制代码忽略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)