C++ 如何确定编译器对元程序的作用?(用于boost.proto)

C++ 如何确定编译器对元程序的作用?(用于boost.proto),c++,metaprogramming,template-meta-programming,boost-proto,C++,Metaprogramming,Template Meta Programming,Boost Proto,如何确定编译器(g++)对模板代码的操作 我正在使用boost.proto(一个表达式模板库)在编译时计算一些数学表达式。代码正确地计算了表达式,但我想看看编译器是否已将表达式扩展为与手写c代码等效的形式(即消除了所有临时性),或者是否还有一些进一步的编译时优化需要完成 有没有办法查看编译器对模板做了什么 谢谢 记录为“仅编译;不组装或链接”。基本上,您得到了汇编输出。 < P>模板实例化PASS之后有几种方式可以看到C++代码: 使用gcc-fdump tree original(甚至-fd

如何确定编译器(g++)对模板代码的操作

我正在使用boost.proto(一个表达式模板库)在编译时计算一些数学表达式。代码正确地计算了表达式,但我想看看编译器是否已将表达式扩展为与手写c代码等效的形式(即消除了所有临时性),或者是否还有一些进一步的编译时优化需要完成

有没有办法查看编译器对模板做了什么

谢谢


记录为“仅编译;不组装或链接”。基本上,您得到了汇编输出。

< P>模板实例化PASS之后有几种方式可以看到C++代码:

  • 使用
    gcc-fdump tree original
    (甚至
    -fdump tree all
    查看更多过程)
  • Use Elsa C++分析器:
  • 使用Clang和LLVM C后端-后者将提供最不可读的代码,但在某些情况下仍然有用。Clang本身也应该有一些AST转储功能

您可以查看程序集,并将其与已编写C代码的程序集进行比较。@Space\u c0w0y我的代码和程序集之间有什么区别吗?我以前从未查看过程序集,但发现这个前景有点令人望而生畏?@Tom:我不知道。@Tom:没有,没有中间步骤。有
g++-E
来查看预处理器做什么,但是模板取决于编译器,一旦编译器完成,你就有了汇编…@Tom,在你的源代码和汇编之间有大量的传递。查看所有的
-fdump-…
选项。哦,我希望g++先转到c,然后再转到汇编。我以前从来没有看过汇编,也许我需要学习……汤姆有几个稀有C++编译器,它们是真正的前端,发射C代码,然后编译;cFAX,第一个C++编译器,是这样工作的。但除了科莫和爱迪生,几十年来没有人这样做。G++和MSVC直接从C++编译为对象代码。@汤姆,您可能还想考虑用CLAN代替GCC编译代码——它比LGC和中间GCC表示更容易检查LLVM IR。您甚至可以使用LLVM CBE target从中生成一个普通的C代码。@Tom:…但这些都不能真正告诉您其他编译器是如何完成的,因为编译器如何将模板源代码转换为机器代码是非常特定于编译器的。所以,套用Donald Knuth的话,在您知道自己有性能问题之前,不要为优化而烦恼。98%的时间,简单地说,如果一个代码工作效率最高,就不要紧。@ DeValEub,模板实例化过程是由C++标准严格定义的。
g++ -S