在现代 C++ 编译器中使用 goto
有哪些性能优势或劣势?
我正在编写一个 C++ 代码生成器,使用 goto
会更容易编写。 没有人会接触生成的 C++ 文件,所以不要对我说“goto 不好”。作为一个好处,它们节省了临时变量的使用。
我想知道,从纯粹的编译器优化角度来看,goto 对编译器优化器的影响?与使用临时/标志相比,它是否使代码更快、更慢或通常没有变化性能。
最佳答案
可能受影响的编译器部分与流程图一起使用。只要您编写严格可移植的代码,您用于创建特定流程图的语法通常是无关紧要的——如果您使用 goto
创建类似 while
循环的东西> 而不是实际的 while
语句,它不会产生与使用 while
循环的语法相同的流程图。然而,使用不可移植的代码,现代编译器允许您向循环添加注释以预测它们是否会被采用。根据编译器的不同,您可能会也可能无法使用 goto
来复制额外的信息(但大多数有循环注释的也有 if
语句的注释,所以控制 goto
的 if
上的 可能采用
或 可能未采用
通常与类似的效果相同相应循环上的注释)。
但是,有可能生成一个带有 goto
的流程图,这是任何正常的流控制语句(循环、开关等)都无法生成的,例如有条件地直接跳转到循环的中间,取决于全局中的值。在这种情况下,您可能会生成一个不可约的流程图,而当/如果您这样做时,这通常会限制编译器优化代码的能力。
换句话说,如果(例如)您采用了使用普通 for
、while
、switch
等编写的代码,并将其转换为在每种情况下都使用 goto
,但保留相同的结构,几乎任何合理的现代编译器都可能以任何一种方式生成基本相同的代码。然而,如果你使用 goto
s 来产生像几十年前我不得不看的一些 FORTRAN 那样的意大利面条,那么编译器可能无法用它做很多事情。
关于c++ - goto 对 C++ 编译器优化的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386152/