用于字节序测试和字节交换的Union hack
|
对于联合,写入一个成员并从另一个成员读取(char数组除外)为UB。
//snippet 1(testing for endianess):
union
{
int i;
char c[sizeof(int)];
} x;
x.i = 1; // writing to i
if(x.c[0] == 1) // reading from c[0]
{ printf(\"little-endian\\n\");
}
else
{ printf(\"big-endian\\n\");
}
//snippet 2(swap bytes using union):
int swapbytes()
{
union // assuming 32bit, sizeof(int)==4
{
int i;
char c[sizeof(int)];
} x;
x.i = 0x12345678; // writing to member i
SWAP(x.ch[0],x.ch[3]); // writing to char array elements
SWAP(x.ch[1],x.ch[2]); // writing to char array elements
return x.i; // reading from x.i
}
片段1是合法的C或C ++,但不是片段2。我正确吗?可以有人指向标准部分,说可以写联合成员并从另一个成员(即char数组)读取是可以的。
没有找到相关结果
已邀请:
2 个回复
缝皋
孤捷侩
这样做的好处是,几乎所有的编译器都会看到,您正在对一定数量的字节进行memcpypy处理并完全优化了memcpy,从而得到与代码段1完全相同的代码,同时完全遵守规则!