这是关于使用我提出的递归方法找到斐波纳契数 在我以前的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 ++程序中发生的编译时计算/操作。
答案 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中有很多关于调试和跟踪模板的信息。