g ++中哪个内部文件包含有关程序编译时计算的信息?

时间:2014-03-26 03:10:37

标签: gcc c++11 g++ clang

这是关于使用我提出的递归方法找到斐波纳契数 在我以前的question。使用其中一个solution(已回答),运行时间 程序差不多是0.我将程序附加到GDB并检查汇编指令 并找到了以下内容:

#include<iostream>
template<size_t N>
struct fibonacci:std::integral_constant<size_t,fibonacci<N-1>{}+fibonacci<N-2>{}>{};
template<> struct fibonacci<1> : std::integral_constant<size_t,1> {};
template<> struct fibonacci<0> : std::integral_constant<size_t,0> {};
int main() {
    int out = 0;
    constexpr int number = 40;
    out = fibonacci<number>();
    std::cout<<"Fibonacci Series Of "<<number<<" is "<<out<<std::endl;
}

我使用以下标志和汇编指令编译了我的程序 我的计划是:

  

$ g ++ -g -gdwarf-2 -Wall -fdump-tree-all -std = c ++ 11 fibonacci.cpp -o   fibcpp

(gdb) disassemble main
   Dump of assembler code for function main():
   0x0000000000400890 <+0>: push   %rbp
   0x0000000000400891 <+1>: mov    %rsp,%rbp
   0x0000000000400894 <+4>: sub    $0x10,%rsp
  0x0000000000400898 <+8>:  movl   $0x0,-0x8(%rbp)
   0x000000000040089f <+15>:    movl   $0x28,-0x4(%rbp)
   0x00000000004008a6 <+22>:    lea    -0x9(%rbp),%rax
   0x00000000004008aa <+26>:    mov    %rax,%rdi
=>  0x00000000004008ad <+29>:   callq  0x400952 <std::integral_constant<unsigned long, 102334155ul>::operator unsigned long() const>
   0x00000000004008b2 <+34>:    mov    %eax,-0x8(%rbp)
   0x00000000004008b5 <+37>:    mov    $0x400a15,%esi

我们可以看到(在箭头==&gt;上)102334155是斐波那契(40)。这表明确实所有计算都发生在编译时。

当我们编译程序并添加额外标志( -fdump-tree-all )时,我们会得到很多 内部文件和通常(fibonacci.gimple)文件是通常模板的文件 实例化的代码会去。但是在这种情况下我没有找到任何东西 与fibonacci.gimple文件中的此计算相关。

我的问题是g ++在哪个文件中计算和存储这些信息?我的目标是更多地了解在C ++程序中发生的编译时计算/操作。

1 个答案:

答案 0 :(得分:2)

从您的反汇编中看来,&#34;方法&#34;调用integral_constant<>::operator value_type()而不是内联。当您查看其反汇编时,您应该看到实际的返回值。它是size_t的实例化,unsigned long = value_type-ftrace-template-instantiation

但你可能已经知道了......你想要真正看到它。消息released a git hub project表示,其他人考虑了{{1}}选项,但尚未实施此选项。

编辑:https://gcc.gnu.org/ml/gcc/2011-06/msg00110.html中有很多关于调试和跟踪模板的信息。