我有以下结构。在侧面计算尺寸的地方。填充后结构的大小应为30Bytes。但是大小是28。结构尺寸28如何?
#include <stdio.h>
struct a
{
char t; //1 byte+7 padding byte Total = 8bytes
double d; //8 bytes Total = 16bytes
short s; //2 bytes Total = 18Bytes
char arr[12];//12 bytes 8+8+4+12=32. Total = 30Bytes
};
int main(void)
{
printf("%d",sizeof(struct a)); // O/p = 28bytes
return 0;
}
答案 0 :(得分:5)
您可以使用offsetof
来了解每个结构成员之后的实际填充:
#include <stddef.h>
printf("Padding after t: %zu\n",
offsetof(struct a, d) - sizeof (((struct a *) 0)->t));
printf("Padding after d: %zu\n",
offsetof(struct a, s) - offsetof(struct a, d)
- sizeof (((struct a *) 0)->d));
printf("Padding after s: %zu\n",
offsetof(struct a, arr) - offsetof(struct a, s)
- sizeof (((struct a *) 0)->s));
printf("Padding after arr: %zu\n",
sizeof(struct a) - offsetof(struct a, arr)
- sizeof (((struct a *) 0)->arr));
正如R.
所写,你可能在32-bit
系统上,double
的对齐方式是4个字节而不是8个。
答案 1 :(得分:4)
您错误地计算了字节填充。这件事取决于编译器选项和其他东西。您应该查看pragma的pack指令,以显示填充的正确值。例如:
#pragma pack(show)
应该通过警告的方式显示字节填充。您还可以明确地设置它以根据您的需要定制代码。在msdn上查找。链接在这里 http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.71%29.aspx
答案 2 :(得分:2)
我认为它在32位边界上对齐,而不是64.这个怎么样:
struct a
{
char t; //1 byte+3 padding bytes Total = 4bytes
double d; //8 bytes Total = 12bytes
short s; //2 bytes+2 padding bytes Total = 16Bytes
char arr[12];//12 bytes 4+8+4+12=28. Total = 28Bytes
};
答案 3 :(得分:2)
我怀疑你是在32位架构上构建的,其中double
没有8字节对齐要求,在这种情况下,对齐变为:
struct a
{
char t; //1 byte+3 padding byte Total = 4bytes
double d; //8 bytes Total = 12bytes
short s; //2 bytes Total = 14Bytes
char arr[12];//12 bytes +2 padding bytes Total = 28Bytes
};
答案 4 :(得分:1)
在这种情况下,对于每个结构成员,内存以4bytes的倍数给出,
char t - 4bytes,double d - 8bytes,short s - 4bytes and char arr [12] - 12bytes。
总计4(字符)+8(双)+4(短)+12(字符数组)= 28字节
答案 5 :(得分:0)
最有可能的是,char后面跟着3个字节的填充(所以double在4字节边界上开始),short也跟着2个字节的填充。
但是......为什么不打印成员补偿来亲眼看看?