合并并统一字节序列

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 权衡时才应该这样做。