C++ 如何知道哪些优化是由我的编译器自动完成的

C++ 如何知道哪些优化是由我的编译器自动完成的,c++,c,C++,C,我正在浏览这个链接,想知道我们如何知道特定编译器完成了哪些优化 VC8.0是否将if-else语句转换为switch case? msdn上有这样的信息吗?首先,如果进行了优化,那么您的程序通常应该运行得更快。之后,您可以检查反汇编代码,以了解执行了何种优化。我对VC8.0一无所知,因此我不确定您将如何访问这些信息。但是,如果您对正在进行的优化类型感兴趣并希望进行实验,我建议您使用。您可以查看从默认C前端生成的未优化、反汇编的字节码,然后运行各种Optimizer传递来查看每次的效果。因为它是一

我正在浏览这个链接,想知道我们如何知道特定编译器完成了哪些优化

VC8.0是否将if-else语句转换为switch case?
msdn上有这样的信息吗?

首先,如果进行了优化,那么您的程序通常应该运行得更快。之后,您可以检查反汇编代码,以了解执行了何种优化。

我对VC8.0一无所知,因此我不确定您将如何访问这些信息。但是,如果您对正在进行的优化类型感兴趣并希望进行实验,我建议您使用。您可以查看从默认C前端生成的未优化、反汇编的字节码,然后运行各种Optimizer传递来查看每次的效果。因为它是一个更好的抽象汇编代码,所以要想弄清楚什么是可从代码派生的优化,什么是特定于机器的优化,往往要容易一些。

这取决于您为编译器选择的优化级别

你可以找到一篇很好的文章

VC8.0是否将if-else语句转换为switch case

编译器不会神奇地重写源代码。即使他们这样做了,那会告诉你什么?您真正想知道的是编译器是否将其编译成跳转表或多个比较操作。任何解汇编程序都会告诉你这一点


为了澄清我的观点:编写switch case语句并不一定意味着二进制文件中将有一个跳转表。不必担心这一点,这就是拥有编译器的全部意义。

与其弄清楚编译器通常执行哪些优化,不如不依赖于这些编译器特定的知识


相反,从一个好的设计和算法开始,编写(尽可能多的)易于理解的可移植代码。然后,如果代码太慢,请分析代码并修复实际热点。编译器优化无疑是有用的,但更好的方法是对代码中实际发生的事情进行调查。源代码级的算法/设计改进通常比有无优化(如将if/else转换为switch case)更有助于提高性能。

因为每个人似乎都想告诉OP他不必担心它,有一些关于编译器优化(选项)的有用信息(尽管没有OP要求的那么具体)

您必须弄清楚您使用的是什么标志,特别是对于MSVC和Intel(GCC发布版本应默认为-O2),但以下是链接:

在编译后反汇编二进制文件之前,这是最接近的结果。

我不确定“将if/else转换为switch/case”是什么意思。我的处理器没有硬件开关/机箱指令

典型的编译器有几种不同的方法来实现switch/case。一个众所周知的方法是使用跳转表,但只有在适当的情况下才能这样做

对于if/else,编译器分析执行流的有向图当然是正常的。我希望编译器注意到每个条件是否引用同一个变量,并且我希望编译器以通常相同的方式处理等价形式的条件。但这不是我会担心的

IIRC,GCC的一般政策是,只要优选的改进结果是可接受的,优化中的回归是可以接受的。优化是复杂的,“通常”一个好的优化并不总是那么好。此外,为了实现完美的优化,编译器必须知道自己不知道的事情(例如,在现实生活中会遇到什么输入)


关键是,除非您碰巧是一名编译器开发人员,否则了解那么多关于特定优化的知识是不值得的。如果您依赖于V8优化的某些内容,那么在V9或V10中可能不会进行特定的优化。

您可能不希望依赖于此信息。对于GCC,它是联机文档的一部分。