gpt4 book ai didi

c++ - 严格的别名规则 : static_cast vs reinterpret_cast

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:27 24 4
gpt4 key购买 nike

考虑源类型 S 和目标类型 D,它们是不相关类型但具有相同的布局(例如 S 是一个简单包装 D 的结构,反之亦然,或者 S 和 D 碰巧具有相同顺序的相同数据成员,等等)。 S和D可以是原始类型,也可以是类类型。

(一)

S* s;
D* d = reinterpret_cast<D*>(s);
//use d

(乙)

S* s;
D* d = static_cast<D*>(static_cast<void*>(s));
//use d

我知道在执行这些转换时我们已经有了未定义的行为,根据严格的别名规则 - 尽管在实践中它很可能会起作用。

严格别名的规则是 here . 不相关 表示布局相同但违反严格别名。

我的问题是:

(A) 和 (B) 完全等价吗?什么时候

(1).如上所述,S 和 D 不相关。

(2). S 和 D 是相关的,因此转换不违反严格的别名规则,因此不是 UB。

最佳答案

在 C++14 (expr.reinterpret.cast/7) 中,如果 sD 正确对齐, 然后是 reinterpret_cast<D *>(s) 的定义是static_cast<D *>(static_cast<void *>(s)) .所以你的两个案例是完全等价的。

如果存在对齐冲突,则转换的结果是未指定的, 这意味着如果结果被取消引用,它实际上是未定义的行为。

注:后面的// use d由于各种原因可能是未定义的行为;但如果是这样,那么它要么在两种情况下都未定义,要么在两种情况下都具有相同的明确定义的行为。您在标题中提到“严格别名”,但严格别名问题仅适用于 *d ,而不是 Actor 本身。

在 C++11 中,要求 SD两者都是标准布局类型,否则结果未指定。

在C++03中,只定义了如果sD 正确对齐, 然后 s == (S *)(D *)s .没有特别要求 (D *)s可以以任何其他方式使用,而不是回退到 S * .你的两个案例在 C++03 中可能有所不同。这显然是一个不能令人满意的规范。

关于c++ - 严格的别名规则 : static_cast vs reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43554991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com