gpt4 book ai didi

c++ - C++ (GCC) 中的 C99 严格别名规则

转载 作者:IT老高 更新时间:2023-10-28 22:00:48 30 4
gpt4 key购买 nike

据我了解,GCC 在 C++ 中支持其所有 C99 功能。但是 C++ 代码中如何处理 C99 严格别名?

我知道在不相关类型之间使用 C 进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是 C++ 呢?由于严格别名不是 C++ 标准的一部分(对吗?),GCC 必须自己指定语义。

我认为 const_caststatic_cast 在相关类型之间进行强制转换,因此它们是安全的,而 reinterpret_cast 可以打破严格的别名规则。

这是正确的理解吗?

最佳答案

不,你可能混合了不同的东西。

严格的别名规则与 C99 标准完全无关。严格的别名规则 Root 于自 [标准化] 时代开始以来存在于 C 和 C++ 中的部分标准。在 C89/90 (6.3) 和 C++98 (3.10/15) 中存在禁止通过另一种类型的左值访问一种类型的对象的子句)。这就是严格别名的全部意义,不多也不少。只是并非所有编译器都想要(或敢于)强制执行或依赖它。 C 和 C++ 语言有时都被用作“高级汇编”语言,严格的别名规则经常会干扰这种使用。正是 GCC 做出了这一大胆的举动,并决定开始在优化中依赖严格的别名规则,这经常会招致那些“汇编”类型的提示。

确实,打破 C++ 中严格的别名规则的最直接的方法是 reinterpret_cast(当然还有 C 风格的强制转换)。但是,static_cast 也可以用于该目的,因为它允许通过使用 void * 作为“链式”强制转换中的中间类型来打破严格的别名

int *pi;
...
double *pd = static_cast<double *>(static_cast<void *>(pi));

const_cast 不能破坏兼容编译器中的严格别名。

至于 C99...C99 引入的是 restrict 限定符。这与别名直接相关,但它本身并不是所谓的严格别名。

关于c++ - C++ (GCC) 中的 C99 严格别名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2771023/

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