合并并统一字节序列
Combine and unite the sequence of bytes in union
我正在尝试组合和统一来自 int 和 short 的字节序列
调试和读取内存时,它是这样对齐的[FF FF FF FF 00 00 00 00]
它不应该看起来像这样 [FF FF FF FF FF FF 00 00]
因为我使用的是 union 吗?
union uniteByte{
unsigned int blockOne;
unsigned short blockTwo;
};
union uniteByte testing;
testing.blockOne =0xffffffff; //4294967295
testing.blockTwo = 0xffff; //65535
printf("%zu\n",sizeof(testing)); // size is 4 why? shouldn't it be 6?
printf("%u\n",testing.blockOne); // 4294967295
printf("%u\n",testing.blockTwo); // 65535
printf("%p",&testing); //0x7ffeefbff4e0 [FF FF FF FF 00 00 00 00]
printf("%p",&testing.blockOne); //0x7ffeefbff4e0 <-- the address is the same as in blockTwo
printf("%p",&testing.blockTwo); //0x7ffeefbff4e0 <-- the address is the same as in blockOne
a union
的目的是为每个成员使用重叠内存,因此大小是最大成员的大小,必要时加上填充。
想要成员独立,就得用struct
。要摆脱成员之间和末尾的填充,请使用 __attribute__((packed))
.
请注意,这通常会对性能产生影响。 CPU 在内存和寄存器之间移动数字的操作通常有对齐要求,这就是结构通常有填充的原因。打包结构时,必须移动数据 byte-by-byte,而不是对数字的完整大小使用单个指令。因此,只有在内存效率非常重要并且您需要这种 time-space 权衡时才应该这样做。
我正在尝试组合和统一来自 int 和 short 的字节序列
调试和读取内存时,它是这样对齐的[FF FF FF FF 00 00 00 00]
它不应该看起来像这样 [FF FF FF FF FF FF 00 00]
因为我使用的是 union 吗?
union uniteByte{
unsigned int blockOne;
unsigned short blockTwo;
};
union uniteByte testing;
testing.blockOne =0xffffffff; //4294967295
testing.blockTwo = 0xffff; //65535
printf("%zu\n",sizeof(testing)); // size is 4 why? shouldn't it be 6?
printf("%u\n",testing.blockOne); // 4294967295
printf("%u\n",testing.blockTwo); // 65535
printf("%p",&testing); //0x7ffeefbff4e0 [FF FF FF FF 00 00 00 00]
printf("%p",&testing.blockOne); //0x7ffeefbff4e0 <-- the address is the same as in blockTwo
printf("%p",&testing.blockTwo); //0x7ffeefbff4e0 <-- the address is the same as in blockOne
a union
的目的是为每个成员使用重叠内存,因此大小是最大成员的大小,必要时加上填充。
想要成员独立,就得用struct
。要摆脱成员之间和末尾的填充,请使用 __attribute__((packed))
.
请注意,这通常会对性能产生影响。 CPU 在内存和寄存器之间移动数字的操作通常有对齐要求,这就是结构通常有填充的原因。打包结构时,必须移动数据 byte-by-byte,而不是对数字的完整大小使用单个指令。因此,只有在内存效率非常重要并且您需要这种 time-space 权衡时才应该这样做。