是否可以在 C 中使联合右对齐?

Rui*_*rch 4 c union memory-alignment

例如,联合的默认对齐方式如下:

union{
   uint32_t v4;
   __uint128_t v6;
}ip;

//in memory
//aaaa
//bbbbbbbbbbbbbbbb
Run Code Online (Sandbox Code Playgroud)

但我想让工会正确对齐:

//            aaaa
//bbbbbbbbbbbbbbbb
Run Code Online (Sandbox Code Playgroud)

是否有可能在 C 中实现这一点?

Ray*_*mel 7

您可以为此使用 C11 匿名结构。

union {
#pragma pack(1)
    struct {
        char padding_[sizeof(__uint128_t) - sizeof(uint32_t)];
        uint32_t v4;
    };
#pragma pack(0)
    __uint128_t v6;
} ip;

// usage
ip.v4 = 0x7F000000;
Run Code Online (Sandbox Code Playgroud)

  • 我建议添加属性“packed”以确保不添加隐式填充字节 (5认同)
  • 小心“打包”结构。包装不仅仅去除填充物。它还会告诉编译器该结构可以并且将会具有任意对齐,这可能会极大地影响性能,具体取决于平台和代码。请参阅 https://godbolt.org/z/1q8ascav9。 (2认同)