C中不需要sizeof结构,因为编译器未添加填充
首先,关于我的问题,我尝试遍历stackoverflow中的现有线程。至少,我找不到一条谈论我的问题的线索。 我正在通过执行32位机器的以下代码C中不需要sizeof结构,因为编译器未添加填充,c,struct,sizeof,C,Struct,Sizeof,首先,关于我的问题,我尝试遍历stackoverflow中的现有线程。至少,我找不到一条谈论我的问题的线索。 我正在通过执行32位机器的以下代码 gcc -m32 -o size32 size.c 相反,我发现编译器没有添加额外的填充。我没有添加属性标志。因此,我希望编译器填充额外的字节。这是我的问题 struct s{ char c; int i; double d; void *p; }; struct s temp; void *q;
gcc -m32 -o size32 size.c
相反,我发现编译器没有添加额外的填充。我没有添加属性标志。因此,我希望编译器填充额外的字节。这是我的问题
struct s{
char c;
int i;
double d;
void *p;
};
struct s temp;
void *q;
double d1=10;
printf("size of struct = %d sizeof q = %d sizeof double = %d\n",sizeof(temp),sizeof(q),sizeof(d1));
输出是
结构的大小=20sizeof q=4sizeof double=8
这是我的计算。char(1字节)+3字节padding+int(4字节)+double(8字节)+(void*)(4字节),由于最长的成员对齐规则(此处double为8字节,因此结构应在8字节边界上对齐),最终总计为24字节。所以总大小应该是24字节。为什么它只显示20个字节
谢谢
Chid在Linux上,除非将
-malign double
传递给编译器,否则double只在4字节边界对齐,因此结构不需要额外的填充
请参阅文档。double只需4字节对齐,即使大小为8字节。在linux上,它是4字节对齐的,8字节带恶意双编译时选项。我怀疑这是否适用于一般linux;我希望它取决于目标CPU和它的ABI。是的,有关double何时与8字节对齐的完整讨论,请参阅。