我提出的内联函数库与测试平台字节序处理和做转换的最佳风格..在C++中,什么是尾数转换
我第一次尝试构建这样的功能:
inline uint32_t NativeToLittle(uint32_t in)
{
if(littleEndian())
return in;
else
{
uint32_t var = 0;
((uint16_t*)&var)[0] = NativeToLittle(((uint16_t*)&in)[1]);
((uint16_t*)&var)[1] = NativeToLittle(((uint16_t*)&in)[0]);
return var;
}
}
这个工作在某些平台上,但与激进的优化选项GCC,它失败(铸造uint32_t的*到uint16_t *跑的严格别名规则相抵触。)
鉴于别名规则作出的提工会,我重写了func蒸发散用工会进行转换,这样的:
inline uint32_t swapEndian(uint32_t in)
{
union ds
{
uint32_t a;
uint16_t b[2];
};
ds var;
ds out;
var.a = in;
out.b[0] = swapEndian(var.b[1]);
out.b[1] = swapEndian(var.b[0]);
return out.a;
}
这个工作对我已经试过了所有平台上,但我并不清楚它是否是好作风。我记得看过一段视频,那位演讲者说这个使用工会进行转换的方案是无效的,因为只有访问工会的一个成员才有效(我不记得这次谈话的网址,对不起)。此外,Stroustrup的JSF编码标准规定“不应使用工会”。
别名规则中唯一的其他相关事物是转换为char类型是有效的。不过,将其转换为字符缓冲区并返回可能非常难看。
那么..这样的结构代码的最佳方式是什么,这是符合标准和合理的可读性?
工会招的确是UB(你可以不读除最后写成的成员之外的成员)。使用位移等。 –
看看Boost Endian是如何做到的。 – GManNickG