【发布时间】:2014-03-26 03:10:36
【问题描述】:
这是关于使用我问过的递归方法找到斐波那契数 在我之前的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
我们可以看到(在箭头上==>)102334155 在那里,它是斐波那契(40)。这表明确实所有计算都发生在编译时。
当我们编译我们的程序并添加额外的标志(-fdump-tree-all),我们得到很多 内部文件和通常(fibonacci.gimple)文件是通常模板的文件 实例化的代码会去。但是在这种情况下,我没有找到任何东西 fibonacci.gimple 文件中与此计算相关。
我的问题是 g++ 在哪个文件中计算和存储这些信息?我在这里的目的是更多地了解发生在 C++ 程序中的编译时间计算/操作。
【问题讨论】:
-
我相信模板实例化是在前端执行的,没有文件会包含执行它的代码。