Это касается определения числа Фибоначчи с использованием рекурсивного подхода, который я задал в предыдущем вопросе . Используя одно из решений (ответ), время выполнения по программе было почти 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 = С++ 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++ вычисляет и хранит эту информацию?. Моя цель здесь состоит в том, чтобы понять больше о вычислении/манипуляции времени компиляции, которое происходит в программе на С++.