与字节顺序无关的数据编码

时间:2017-04-12 12:38:08

标签: c++ endianness

我正在实现一个与字节无关的数据编码(写入缓冲区),如下所示:

for (uint32_t i = 0; i < sizeof(value); ++i)
{
  buffer[i] = static_cast<uint8_t>(value >> 8 * i); // not optimized
}

gcc和clang都展开循环,但第一个(未注释的)行正在编译到这个程序集:

mov    eax,edi
mov    BYTE PTR [rsp],dil
sar    eax,0x8
mov    rsi,rsp
mov    BYTE PTR [rsp+0x1],al
mov    eax,edi
sar    edi,0x18
sar    eax,0x10
mov    BYTE PTR [rsp+0x3],dil
mov    BYTE PTR [rsp+0x2],al

但它基本上是在little-endian架构上从值到*缓冲区的赋值。有没有办法欺骗编译器将其转换为简单的赋值而不是4字节的移动(当编译小端目标时)?

PS。我知道我可以在编译时进行运行时检查(分支)或检查endian(通过__BYTE_ORDER__宏),但我想在没有检查的情况下进行(带有移位)

0 个答案:

没有答案