Какой внутренний файл в g++ содержит информацию о расчете времени компиляции программы?

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

Ответ 1

От вас разборки кажется, что "метод" operator unsigned long() вызывается и не встроен. Когда вы посмотрите на его разборку, вы увидите фактическое возвращаемое значение. Это экземпляр integral_constant<>::operator value_type() с size_t= unsigned long как value_type.

Но вы, возможно, уже все это знаете... Вы действительно хотите это увидеть. Сообщение https://gcc.gnu.org/ml/gcc/2011-06/msg00110.html предполагает, что другие думали о опции -ftrace-template-instantiation, но никто ее не реализовал.

EDIT: в разделе этого вопроса есть много информации об шаблонах отладки и трассировки.