Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何查看C++;优化代码_C++_G++_Clang_Compiler Optimization - Fatal编程技术网

C++ 如何查看C++;优化代码

C++ 如何查看C++;优化代码,c++,g++,clang,compiler-optimization,C++,G++,Clang,Compiler Optimization,我想知道当优化被打开时,编译器是如何用铿锵+++/g++重新格式化一段代码的。我知道英特尔编译器有一个生成相关输出的标志,但我似乎在其他编译器中找不到相应的标志。查看汇编程序输出 这是一个可以并排查看此功能和功能着色的网站: 一次可以比较多个编译器(版本) 通用条款: Clang是作为GCC的替代品设计的,因此同样的参数也适用。 -S将汇编程序代码输出到.S文件中 -O3是优化级别3 示例: clang -S test.cpp -o test_clang_O3.s g++ -S test.cp

我想知道当优化被打开时,编译器是如何用铿锵+++/g++重新格式化一段代码的。我知道英特尔编译器有一个生成相关输出的标志,但我似乎在其他编译器中找不到相应的标志。

查看汇编程序输出 这是一个可以并排查看此功能和功能着色的网站:
一次可以比较多个编译器(版本)

通用条款:

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”开关:
(示例:-fopt info optimized->成功应用优化时打印信息。)

对于Clang,它是“发出”优化报告:
< > P>编译器不优化C++代码;编译器将C++翻译成一个实现的定义的“内部表示”并优化它。然后他们将其转换为CPU可以执行的代码,并可能进一步优化

(记住:C++是抽象的;C++代码定义程序的语义。计算机不使用它作为一系列实际指令来执行。)< /P>


因此,没有“优化的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++库,看看发生了什么!p> 假设您想查看汇编代码,这里有一个快速提示:我认为这更直接一点:这很方便,谢谢。不过,我更感兴趣的是更具人类可读性的东西,例如,编译器做出了哪些优化决策,在哪里,在哪里,当然,在适用的地方。。!我不知道。从未见过,所以我要撤退并潜伏,因为如果它存在的话,我有点兴趣自己玩它。编译器优化通常是难以理解的,除非你对汇编语言有基本的掌握。我不确定是否所有的优化都发生在内部表示上,IIRC GCC已经或者已经在生成的程序集上运行了一些优化,这是因为内部表示不是针对任何单一的体系结构。这意味着您生成的x86程序集最终将丢失某些特定的快捷方式,然后您可以使用了解这些特定x86技巧的窥视孔优化器来修复这些快捷方式。@MSalters:Added@LightnessRacesinOrbit这并不完全准确,因为编译器进行了很多具有象征意义的优化,例如,删除死代码,将变量从循环中移出,循环向量化,所以我要寻找的是一种方法,来查看每个决策是在哪里做出的。这不完全是我想要的,但它足够接近:)这真的很酷,谢谢!只是一个提示,你可以在这里导航并下载几个文件来让它工作,不需要克隆整个repo(我还需要安装几个python包,没什么特别的)