Can we see the template instantiated code by C++ compiler

前端 未结 8 1888
死守一世寂寞
死守一世寂寞 2020-11-30 20:09

is there a way to know the compiler instantiated code for a template function or a class in C++

Assume I have the following piece of code

template &l         


        
相关标签:
8条回答
  • 2020-11-30 20:43

    When the optimizer has done its deeds, you most likely have nothing left that looks like a function call. In your specific example, you'll definitely end up with an inlined addition, at worse. Other than that, you can always emit the generated assembler in a separate file during compilation, and there lies your answer.

    0 讨论(0)
  • 2020-11-30 20:54

    You can definitely see the assembly code generated by the g++ using the "-S" option.

    I don't think it is possible to display the "C++" equivalent template code - but I would still want a g++ developer to chime in why - I don't know the architecture of gcc.

    When using assembly, you can review the resulting code looking for what resembles your function. As a result of running gcc -S -O1 {yourcode.cpp}, I got this (AMD64, gcc 4.4.4)

    _Z3addIiET_S0_S0_:
    .LFB2:
        .cfi_startproc
        .cfi_personality 0x3,__gxx_personality_v0
        leal    (%rsi,%rdi), %eax
        ret
        .cfi_endproc
    

    Which really is just an int addition (leal).

    Now, how to decode the c++ name mangler? there is a utility called c++filt, you paste the canonical (C-equivalent) name and you get the demangled c++ equivalent

    qdot@nightfly /dev/shm $ c++filt 
    _Z3addIiET_S0_S0_ 
    int add<int>(int, int)
    
    0 讨论(0)
  • 2020-11-30 21:02

    If you want to see the assembly output, use this:

    g++ -S file.cpp
    

    If you want to see some (pseudo) C++ code that GCC generates, you can use this:

    g++ -fdump-tree-original file.cpp
    

    For your add function, this will output something like

    ;; Function T add(const T&, const T&) [with T = int] (null)
    ;; enabled by -tree-original
    
    return <retval> = (int) *l + (int) *r;
    

    (I passed the parameters by reference to make the output a little more interesting)

    0 讨论(0)
  • 2020-11-30 21:03

    The easiest is to inspect the generated assembly. You can get an assembly source by using -S flag for g++.

    0 讨论(0)
  • 2020-11-30 21:05

    Clang (https://clang.llvm.org/) can pretty-print AST of instantiated template:

    For your example:

    test.cpp

    template < class T> T add(T a, T b){
        return a+b;
    }
    
    void tmp() {
        add<int>(10,2); 
    }
    

    Command to pretty-print AST:

    $ clang++ -Xclang -ast-print -fsyntax-only test.cpp
    

    Clang-5.0 output:

    template <class T> T add(T a, T b) {
        return a + b;
    }
    template<> int add<int>(int a, int b) {
        return a + b;
    }
    void tmp() {
        add<int>(10, 2);
    }
    
    0 讨论(0)
  • 2020-11-30 21:06

    If your looking for the equivalent C++ code then no. The compiler never generates it. It's much faster for the compiler to generate it's intermediate representation straight off than to generate c++ first.

    0 讨论(0)
提交回复
热议问题