我正在实现一个与字节无关的数据编码(写入缓冲区),如下所示:
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__宏),但我想在没有检查的情况下进行(带有移位)