可能重复:
Aliasing `T*` with `char*` is allowed. Is it also allowed the other way around?
我正在使用std::array
char
来保存未知基元类型的值,长度不超过10个字节,如下所示:
std::array<char, 10> val;
*reinterpret_cast<double*>(val.data()) = 6.3;
//blah blah blah...
double stuff = *reinterpret_cast<double*>(val.data());
我已经读过,在char *
之间来回转换并不是未定义的,因为编译器假定char *
可以为任何类型的值添加别名。当值放在(我假设的)对象内的char
数组时,这仍然有效吗?
注意:我知道我可以在这里使用union,但这会导致我正在做的大量样板代码,并且我想在必要时避免它,因此问题。
答案 0 :(得分:13)
是的,std::array< char, 10 >
不符合double
的对齐要求,因此reinterpret_cast
会激发UB。
答案 1 :(得分:0)
包含数组的内容并不重要。
该标准甚至不考虑包围某些内容(它是基本内容),但支持转换为char
序列的转换。
要通过reinterpret_cast
和分配直接执行此操作,您需要正确对齐缓冲区。
另一种方法是使用memcpy
,它不关心对齐。
在相关问题上,通常不是一个好主意,直到二进制级别。例如,编译器的简单版本更改可能使二进制序列化数据的文件不可访问。无论如何,这样做的主要驱动因素是原始性能考虑因素。