这是使用 std::array 未定义的行为吗?
Is this use of std::array undefined behavior?
可能的重复:
允许将"T*"与"char*"混叠。反过来也允许吗?
我使用char
s 的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 *
可以别名任何类型的值。当值放置在对象内部的char
s 数组中(我假设是)时,这仍然有效吗?
注意:我知道我可以在这里使用联合,但这会导致我正在做的事情产生大量的样板代码,如果有必要,我想避免它,因此问题。
是的,std::array< char, 10 >
不满足double
的对齐要求,因此reinterpret_cast
会引发 UB。
请尝试std::aligned_storage
。
数组包含在什么中并不重要。
该标准甚至不考虑围绕某物的内容(这是基本的),但确实支持与char
序列之间的转换。
要直接通过reinterpret_cast
和分配执行此操作,您需要正确对齐缓冲区。
另一种方法是使用memcpy
,它不关心对齐。
在相关问题上,下降到二进制级别通常不是一个好主意。例如,编译器的简单版本更改可能会使二进制序列化数据的文件无法访问。无论如何,执行此操作的主要驱动因素是原始性能注意事项。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 架构x86_64的未定义符号链接constexpr std :: array
- 数组:标识符"array"未定义
- 这是使用 std::array 未定义的行为吗?
- 未定义模板 'std::__1::array<int, 3>' 的隐式实例化