c++ - goto 对 C++ 编译器优化的影响

标签 c++ optimization compiler-optimization goto

在现代 C++ 编译器中使用 goto 有哪些性能优势或劣势?

我正在编写一个 C++ 代码生成器,使用 goto 会更容易编写。 没有人会接触生成的 C++ 文件,所以不要对我说“goto 不好”。作为一个好处,它们节省了临时变量的使用。

我想知道,从纯粹的编译器优化角度来看,goto 对编译器优化器的影响?与使用临时/标志相比,它是否使代码更快更慢或通常没有变化性能。

最佳答案

可能受影响的编译器部分与流程图一起使用。只要您编写严格可移植的代码,您用于创建特定流程图的语法通常是无关紧要的——如果您使用 goto 创建类似 while 循环的东西> 而不是实际的 while 语句,它不会产生与使用 while 循环的语法相同的流程图。然而,使用不可移植的代码,现代编译器允许您向循环添加注释以预测它们是否会被采用。根据编译器的不同,您可能会也可能无法使用 goto 来复制额外的信息(但大多数有循环注释的也有 if 语句的注释,所以控制 gotoif 上的 可能采用可能未采用 通常与类似的效果相同相应循环上的注释)。

但是,有可能生成一个带有 goto 的流程图,这是任何正常的流控制语句(循环、开关等)都无法生成的,例如有条件地直接跳转到循环的中间,取决于全局中的值。在这种情况下,您可能会生成一个不可约的流程图,而当/如果您这样做时,这通常会限制编译器优化代码的能力。

换句话说,如果(例如)您采用了使用普通 forwhileswitch 等编写的代码,并将其转换为在每种情况下都使用 goto ,但保留相同的结构,几乎任何合理的现代编译器都可能以任何一种方式生成基本相同的代码。然而,如果你使用 gotos 来产生像几十年前我不得不看的一些 FORTRAN 那样的意大利面条,那么编译器可能无法用它做很多事情。

关于c++ - goto 对 C++ 编译器优化的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386152/

相关文章:

python - 清理时使用 Boost Python 的段错误

c++ - 替换 LLVM IR 中的指令

c++ - 除以零预防 : Checking the divisor's expression doesn't result in zero vs. 检查除数不为零?

c++ - 通过获取原子载荷来提升非原子载荷

c++ - GCC 不会优化整数算术表达式

c++ - 分配顺序产生不同的装配

c++ - 避免使用内联 asm 优化 away 变量

java - String.lastIndexOf() char 和具有单个字符的字符串之间有区别吗?

c - 为什么优化会破坏这个 C 代码?

c++ - 在 C++ 中使用对象时对性能的影响