这是使用 std::array 未定义的行为吗?

Is this use of std::array undefined behavior?

本文关键字:未定义 array std      更新时间:2023-10-16

可能的重复:
允许将"T*"与"char*"混叠。反过来也允许吗?

我使用chars 的std::array来保存未知基元类型的值,该值长度不超过 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 *可以别名任何类型的值。当值放置在对象内部的chars 数组中(我假设是)时,这仍然有效吗?

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

是的,std::array< char, 10 >不满足double的对齐要求,因此reinterpret_cast会引发 UB。

请尝试std::aligned_storage

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

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

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

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

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