gpt4 book ai didi

c++ - 优化器何时可以组合对成员函数的调用?

转载 作者:行者123 更新时间:2023-11-28 06:03:24 25 4
gpt4 key购买 nike

我想知道在什么情况下,像 GCC 和 LLVM 这样的编译器能够优化同一个函数中对一些普通成员函数的多次调用,比如 size()length() 多个 STL 容器只需一次调用?

例如,如果我在同一个函数中两次将值与容器的大小进行比较,但从未真正更改容器,它能否将这些组合到一个函数调用中?如果可以,什么时候?

编译器应该能够进行优化,除非它可能认为另一个线程可能同时在处理容器。另一方面,典型的 it != x.end() 循环中的守卫似乎被优化为只调用一次 x.end() 我认为这是发生了,因为如果其他线程要从 x 添加/删除东西,那么它会使迭代器 it 无效,所以我们可以自由地进行优化,因为我们无论如何都会有未定义的行为。

最佳答案

允许编译器省略不会产生可见效果的代码。引用:C++11 规范草案 4296 在 1.9 程序执行 [intro.execution] §5

...conforming implementations are required to emulate (only) the observable behavior of the abstract machine as explained below.

注释给出了以下精度(强调我的):

This provision is sometimes called the “as-if” rule, because an implementation is free to disregard any requirement of this International Standard as long as the result is as if the requirement had been obeyed, as far as can be determined from the observable behavior of the program. For instance, an actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no side effects affecting the observable behavior of the program are produced.

如果编译器知道某个特定方法没有副作用,它可以替换(前提是 x 不是 volatile):

int x = myfunction(y);
... // other instructions not changing x
int x = myfunction(z);

int x = myfunction(z);
... // other instructions not changing x

这里的问题是,您正在从标准库中调用一个函数,而编译器可能不知道该实现是否会产生副作用。例如,调试实现可以​​通过调用 header (*) 中不存在的方法来跟踪对 size 方法的所有调用,但这是禁止在此处省略代码的唯一原因。

其他线程改变容器不是编译器的问题,而是程序员的问题。 必须同步访问。

(*) 如评论中所述,容器代码仅在 header 中(模板常见)编译器可以在编译时知道 size 方法不会有可见的副作用,并且可以优化第二个调用。但这不是标准要求的,应被视为实现细节。

关于c++ - 优化器何时可以组合对成员函数的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845759/

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