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

时间:2012-11-08 00:44:23

标签: c++ c++11 undefined-behavior

  

可能重复:
  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,但这会导致我正在做的大量样板代码,并且我想在必要时避免它,因此问题。

2 个答案:

答案 0 :(得分:13)

是的,std::array< char, 10 >不符合double的对齐要求,因此reinterpret_cast会激发UB。

请尝试std::aligned_storage

答案 1 :(得分:0)

包含数组的内容并不重要。

该标准甚至不考虑包围某些内容(它是基本内容),但支持转换为char序列的转换。

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

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

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