man*_*ans 20 c c++ struct sizeof memory-alignment
我有一个结构,我想计算它的大小:
#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)
Run Code Online (Sandbox Code Playgroud)
静态断言显示大小为24,但我的计算表明它应该是26.
为什么尺寸为24?
我正在使用visual studio 2012处理Windows 7,32位应用程序
Wal*_*ter 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
Run Code Online (Sandbox Code Playgroud)
编辑 最后的填充是必要的,以确保所有元素
MyStruct A[10]; // or
MyStruct*B = new MyStruct[10];
Run Code Online (Sandbox Code Playgroud)
适当调整.这要求sizeof(MyStruct)是倍数 alignof(MyStruct).这里,sizeof(MyStruct)= 6*alignof(MyStruct).
任何struct/ class类型总是填充到其对齐的下一个倍数.
Lun*_*din 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);
Run Code Online (Sandbox Code Playgroud)
(%zd用于打印size_t,%td打印ptrdiff_t.普通%d纸在大多数系统上都可以正常工作.)
输出:
sizeof(ms): 24
i1 0
i2 4
s1 8
c 10
s2 18
s3 20
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |