8

可能重复:
允许将 `T*` 与 `char*` 混淆。是否也允许反过来?

我使用 a std::arrayof chars 来保存未知原始类型的值,其长度不超过 10 个字节,如下所示:

std::array<char, 10> val;
*reinterpret_cast<double*>(val.data()) = 6.3;
//blah blah blah...
double stuff = *reinterpret_cast<double*>(val.data());

我已经读过来回转换char *不是未定义的,因为编译器假定 achar *可以为任何类型的值取别名。当值被放置在(我假设是)char对象内的 s 数组中时,这仍然有效吗?

注意:我知道我可以在这里使用联合,但这会导致我正在做的事情有大量的样板代码,如果有必要我想避免它,因此这个问题。

4

2 回答 2

13

std::array< char, 10 >的,不满足对齐要求,double所以reinterpret_cast会招致UB。

试试std::aligned_storage吧。

于 2012-11-08T00:49:19.357 回答
0

数组包含在什么中并不重要。

该标准甚至不考虑围绕某事物的内容(这是基本的),但确实支持与char序列的转换。

要通过reinterpret_cast和赋值直接执行此操作,您需要正确对齐缓冲区。

另一种方法是使用memcpy,它不关心对齐。

在一个相关问题上,降低到二进制级别通常不是一个好主意。例如,编译器的简单版本更改可能会使二进制序列化数据文件无法访问。无论如何,这样做的主要驱动因素是原始性能考虑。

于 2012-11-08T00:52:34.577 回答