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

时间:2017-03-07 21:21:12

标签: c++ g++ clang compiler-optimization

我想知道是否/如何可以看到编译器在启用优化时如何使用clang ++ / g ++重构一段代码。我知道英特尔编译器有一个标志来产生相关的输出,但我似乎无法在其他编译器中找到它。

3 个答案:

答案 0 :(得分:4)

所以,多亏了你的指示,我能够发现一些非常酷的东西,所以我想我会分享:

使用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文件夹中)进行导航。

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

enter image description here

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

答案 1 :(得分:3)

查看汇编程序输出

这是一个可以并排查看功能的网站: Compiler explorer
可以一次比较多个编译器(带有版本)。

海湾合作委员会: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优化,您必须检查&#34; fdump&#34;和&#34; fopt&#34;开关: GCC Debugging-Options
(例如:-fopt-info-optimized - &gt;成功应用优化后的打印信息。)

对于Clang来说,它是&#34;发出&#34;优化报告: Clang - Options to Emit Optimization Reports

答案 2 :(得分:1)

编译器不优化C ++代码;编译器将C ++转换为实现定义的“内部表示”并对其进行优化。然后他们将其转换为CPU可以执行的代码,并可能进一步优化

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

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