我有一个我想要计算其大小的结构:
#pragma pack(push,4)
struct MyStruct
{
uint32_t i1; /* size=4, offset=0. */
uint32_t i2; /* size =4 offset =4 */
uint16_t s1; /* size =2 offset=8 */
unsigned char c[8]; /* size=8 offset=12*/
uint16_t s2; /* size=2 offset=20. */
uint16_t s3; /* size=2 offset=24. */
} ; // total size is 26
static_assert(sizeof(MyStruct) == 24, "size of MyStruct incorrect");
#pragma pack(pop)
静态断言显示大小为24,但我的计算表明它应该是26。
为什么尺寸为24?
我正在使用visual studio 2012开发Windows 7,32位应用程序
答案 0 :(得分:26)
uint16_t
的对齐方式仅为2,因此偏移量为:
#pragma pack(push,4)
struct MyStruct
{
uint32_t i1; /* offset=0 size=4 */
uint32_t i2; /* offset=4 size=4 */
uint16_t s1; /* offset=8 size=2 */
unsigned char c[8]; /* offset=10 size=8 */
uint16_t s2; /* offset=18 size=2 */
uint16_t s3; /* offset=20 size=2 */
/* offset=22 padding=2 (needed to align MyStruct) */
} ; // total size is 24
修改强> 最后的填充是确保
的所有元素所必需的MyStruct A[10]; // or
MyStruct*B = new MyStruct[10];
适当对齐。这要求sizeof(MyStruct)
是alignof(MyStruct)
的倍数。在此,sizeof(MyStruct)
= 6 * alignof(MyStruct)
。
任何struct
/ class
类型始终填充到其对齐的下一个倍数。
答案 1 :(得分:22)
除了沃尔特的回答,请考虑自己捕捉这条鱼。您只需要printf函数和简单的算术:
struct MyStruct ms;
printf("sizeof(ms): %zd\n", sizeof(ms));
printf("i1\t%td\n", (uint8_t*)&ms.i1 - (uint8_t*)&ms);
printf("i2\t%td\n", (uint8_t*)&ms.i2 - (uint8_t*)&ms);
printf("s1\t%td\n", (uint8_t*)&ms.s1 - (uint8_t*)&ms);
printf("c \t%td\n", (uint8_t*)&ms.c - (uint8_t*)&ms);
printf("s2\t%td\n", (uint8_t*)&ms.s2 - (uint8_t*)&ms);
printf("s3\t%td\n", (uint8_t*)&ms.s3 - (uint8_t*)&ms);
(%zd
用于打印size_t
,%td
用于打印ptrdiff_t
。普通%d
可能在大多数系统上运行正常。)
输出:
sizeof(ms): 24
i1 0
i2 4
s1 8
c 10
s2 18
s3 20
答案 2 :(得分:-6)
4 4 2 8 2 2 - 将打包为:
4 4 4 8 2 2 - 最后两个以4个字节组合在一起。第三项需要填充,最后一项和前一项不需要填充。