如何通过优化查看 C++ 代码的编译器重构

How to see compiler reformulation of C++ code with optimizations

我想知道 if/how 是否有可能看到编译器在打开优化时如何使用 clang++/g++ 重新编写一段代码。我知道英特尔编译器有一个标志来产生相关输出,但我似乎无法在其他编译器中找到等效项。

查看汇编器输出

这是一个网站,可以并排查看和着色功能: Compiler explorer
一次可以比较 1 个以上的编译器(带版本)。

海湾合作委员会:How to Save the Assembler Code Generated by GCC

Clang 是作为 GCC 的替代品而设计的,因此可以使用相同的参数。
-S 将汇编代码输出到.s 文件
-O3 是优化级别 3

示例:

clang -S test.cpp -o test_clang_O3.s
g++ -S test.cpp -o test_gcc_O3.s
clang -O3 -S test.cpp -o test_clang_O3.s
g++ -O3 -S test.cpp -o test_gcc_O3.s


视图优化

要查看 gcc 优化,您必须检查 "fdump" 和 "fopt" 开关: GCC Debugging-Options
(例如:-fopt-info-optimized -> 成功应用优化时打印信息。)

对于 Clang,它是 "emit" 优化报告: Clang - Options to Emit Optimization Reports

编译器不优化 C++ 代码;编译器将 C++ 翻译成实现定义的 "internal representation" 并对其进行优化。然后他们将其翻译成您的 CPU 可以执行的代码,并可能进一步优化 that

(请记住:C++ 是一种抽象;您的 C++ 代码定义了程序的语义。您的计算机不会将其用作执行的一系列实际指令。)

因此,没有"optimised C++"供您阅读;您只能查看生成的程序集,并将其与您说服编译器不要如此积极优化的构建中的程序集进行比较。使用 LLVM,您也许可以查看内部表示本身,但我对此了解不多。

所以,感谢您的指导,我发现了一些非常酷的东西,所以我想分享一下:

使用Clang++-4.0,可以按如下方式编译可执行文件:

clang++-4.0 -std=c++14 -O3  -fsave-optimization-record -foptimization-record-file=myOptfile.yaml sourceFile.cpp

这会在 myOptfile.yaml 中保存 成功和不成功的 优化记录。这可以使用 llvm-opt-report-4.0 查看,但它的真正威力是使用 llvm/utils/opt-viewer.py.

查看

为此,克隆 llvm 存储库,导航到您的源目录,并在生成 myOptFile.yaml 后 运行 以下内容:

python ~/myInstallDir/llvm/utils/opt-viewer/opt-viewer.py myOptFile.yaml reportsDirectory/

这将创建大量 html 个文件,您可以使用 index.html(在 reportsDirectory 文件夹中)导航这些文件。

结果很棒,看起来像这样:

大多数内容都是可点击的,因此您可以使用 html 超链接导航到源代码的其他部分,包括 C++ 库,看看发生了什么!