reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
reinterpret_cast, read-only access, trivially copyable types, what can go wrong?
众所周知,访问reinterpret_cast<pointer/reference>(obj)
的结果是未定义的行为(少数情况除外(。
现在,假设您只在 reinterpret_cast 变量的生命周期内对obj
进行只读访问:
TypeA *a = ...;
{
const TypeB *b = reinterpret_cast<const TypeB*>(a);
// b's lifetime is this scope
// I know, that accessing the object pointed by 'b' is UB
// but what can go wrong in practice in this scope,
// if the code uses 'a' and 'b' only in a read-only manner,
// for example:
cout << a->something;
cout << b->otherSomething;
}
(TypeA
和TypeB
是微不足道的可复制和不相关的;假设我们这里没有一致性问题(
我的主要问题:如果标准允许,我们会失去任何优化潜力吗?
我的意思是,如果通过b
的可访问内存将在b
的生命周期内(以任何方式(实际修改,则这只是 UB,而不是当前的原则。
这是一个明智的想法吗?
例如,这个想法可能有用:
- 有一个
char8_t
提案,它将在标准中加入一个新的字符类型,不允许别名。现在假设代码库更改为此类型。还有一个遗留库,由这个代码库使用,它一直使用char
来存储 utf-8。现在,如果我们想避免 UB,我们需要 在char
和char8_t
之间复制.但这些在内存中实际上是相同的,所以reinterpret_cast
应该完成这项工作。 - 一个简单的
reinterpret_cast<const uint32_t&>(some_float)
可以用这个想法很好地定义。不需要bit_cast
.
混叠限制简化了编译和优化。假设您有以下代码:
TypeA *a = ...;
{
const TypeB *b = reinterpret_cast<const TypeB*>(a);
cout << a->something;
cout << b->otherSomething;
}
a->modifier();
编译器需要知道*b
是*a
的别名,以便它不会重新排序为:
TypeA *a = ...;
const TypeB *b = reinterpret_cast<const TypeB*>(a);
cout << a->something;
a->modifier();
cout << b->otherSomething;
在这种情况下,分析很容易,但想象一下,人们宣布了一个void f(TypeA* a, const TypeB* b)
。在f
体内,先前的重新排序将是一场灾难。编译器是否应该拒绝调用任何带有a
和b
作为参数的函数?或者我们应该通知编译器f
的第一个参数可能被别名:void f(TypeA* __unrestricted a, const TypeB* __unrestricted b)
?
我相信这将是无休止的讨论的开始。此外,它不在时尚趋势中(见 Rust(。
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 您应该在什么时候创建自己的异常类型
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 未命名的非类型模板参数有什么意义?
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 模板<>模板<类型名 T> 语法有什么用?
- 指针类型类成员的动态强制转换的恒定性是什么?
- 当 c++ 需要一种数据类型并获取另一种数据类型时会发生什么?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 返回类型在 C++ OOP 中是什么意思
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- 删除对象(具有不同类型)的引用时会发生什么情况?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 当你只使用 return 时,函数返回什么类型;在 c++ 中