c++ - 是否允许从 CppCon 示例中进行这些编译器优化?

标签 c++ optimization compiler-optimization

我正在观看 CppCon 视频,其中显示了这段代码:

void foo(const int&);

bool bar(int x)
{
    const int y = x + 1;
    foo(y);
    return y > x;
}

首先,演讲者说,由于 foo() 函数通过 const 引用获取 'y',而 'y' 实际上是一个 const int,因此在运行时更改 foo() 中的值是未定义的行为。并且似乎在说,因为这是非法的编译器,实际上应该假设'y'在对 foo() 的调用中没有改变,并且 bar() 函数应该只返回 true 而不进行比较。

The compiler is allowed, as far as I know, to just return true, because it really is illegal for foo() to change 'y'.

然后说“但它没有”,好像在暗示这是错过优化的编译器的缺点。他说得对吗?

此外,关于“y”总是大于“x”的假设,因此函数应该只返回 true 而不是比较它们,是否有一个值可以传递给函数,即 max该类型可以容纳的值,其中“y = x + 1”将导致溢出,这意味着 y > x 不再为真?我相信签名和未签名的情况都是如此。

So in this example there's signed integers, 'y' is equal to 'x' plus 1, so if 'y' doesn't change, it's now always bigger than 'x'. The compiler's allowed to make that assumption for signed, not unsigned.

他还说:

If you change it to pass by value, then it works.

好像说比较指令没有了,函数刚好返回true,但是给定整数溢出点,编译器怎么能做出这样的假设呢?

Here是视频中的相关点。

最佳答案

有符号 int 溢出未定义,因此允许编译器忽略 x + 1 可能减少 x.

编译器在设计优化策略方面做得越来越好;您可以期望您的函数被优化为调用 foo,然后在将来 return true;

关于c++ - 是否允许从 CppCon 示例中进行这些编译器优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53881174/

相关文章:

c++ - SFINAE:编译器不选择专门的模板类

ARM 设备上代码优化的 C++ 技巧

php - MySQL插入和更新优化

haskell - 为什么 Haskell 中没有隐式并行性?

检查值是否在音叉反汇编中

c++ - 判断两个矩形是否相交

c++ - cpp : How to find symbols removed in function level linking

java - 编写空检查的更简洁的方法(可能没有 IF?)

c - ARM 的微优化 C 代码

c++ - 使用 unique_ptr 的常量字符指针