【问题标题】:Which internal file in g++ contain the information about compile time calculation of program?g++中哪个内部文件包含程序编译时间计算的信息?
【发布时间】: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++ 程序中的编译时间计算/操作。

【问题讨论】:

  • 我相信模板实例化是在前端执行的,没有文件会包含执行它的代码。

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


【解决方案1】:

从你的反汇编看来,“方法”operator unsigned long() 被调用而不是内联。当你查看它的反汇编时,你应该看到实际的返回值。它是integral_constant&lt;&gt;::operator value_type() 的实例化,size_t = unsigned longvalue_type

但是您可能已经知道所有这些...您想真正看到它。 https://gcc.gnu.org/ml/gcc/2011-06/msg00110.html 的消息表明,其他人考虑过 -ftrace-template-instantiation 选项,但还没有人实现它。

编辑:this question 中有很多关于调试和跟踪模板的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多