c++ - 在遵守严格的别名规则的同时使用 reinterpret_cast
问题描述
我知道这段代码会undefined behaviour
由于违反严格的别名规则而导致,因为我们指向具有类型的相同内存位置int
并float
取消引用它,在编译器优化发生后代码可能会中断:
int main(){
int a = 5;
float f = *reinterpret_cast<float*>(&a);
return (int) f;
}
但是这个片段怎么样?
#include <iostream>
int main(){
intptr_t p = 1234; // let's assume this is a valid address in memory.
float f = *reinterpret_cast<float*>(p);
return (int) f;
}
在上面,如果我们假设p
是一个有效的内存地址(不会导致段错误),它是否仍然有 UB 并打破严格的别名规则?没有其他代码指向该内存块。
编辑
我的第二个例子可以这样写bit_cast
:
intptr_t p = 1234; // let's assume this is a valid address in memory.
float f = *std::bit_cast<float*>(p);
解决方案
是的,它仍然会打破严格的别名规则,因为您将尝试取消引用指向 的指针float
,但float
对象从未存在于该地址。
幸运的是,在 C++ 20 中,您可以std::bit_cast
用于此目的。在 C++20 之前,您可以直接转换 :),因为即使这是 UB,也没有理智的编译器会产生与您期望的结果不同的结果,因为这种技术无处不在。
推荐阅读
- time-complexity - 为什么n^2 logn + n(logn)^2 = O(n^2(logn)^2)的时间复杂度?
- c# - 一般铸造混乱
- python - 如果 Flask 上不存在表,如何使用 SQLAlchemy 创建表?
- html - “这个”在反应的输入中没有识别到获得价值
- excel - 使用 VBA 在 Excel 中为多个文件打开 ASCII 文件 - 循环在同一个输出文件中运行,而不是下一个文件
- python - 在 Python 中如何使用行值来引用列
- python - 无法在 Python3 中安装 tensorflow 模块
- python - Eclipse上的PyDev,代码分析不起作用,一些代码错误检测不到
- python - 如何在 wxpython 桌面应用程序中使用 ipywidgets?
- laravel - 我如何访问数据透视表字段