我们可以通过C++编译器看到模板实例化的代码

Vin*_*ddy 41 c++

有没有办法知道模板函数或C++中的类的编译器实例化代码

假设我有以下代码

template < class T> T add(T a, T b){
            return a+b;
}
Run Code Online (Sandbox Code Playgroud)

现在我打电话的时候

add<int>(10,2); 
Run Code Online (Sandbox Code Playgroud)

我想知道编译器为int特定版本创建的函数.

我正在使用G ++,VC++.如果有些人可以帮我指出编译器选项来实现这一点,将会很有帮助.

希望问题很清楚.提前致谢.

ran*_*dom 40

Clang(https://clang.llvm.org/)可以精确打印实例化模板的AST:

对于你的例子:

TEST.CPP

template < class T> T add(T a, T b){
    return a+b;
}

void tmp() {
    add<int>(10,2); 
}
Run Code Online (Sandbox Code Playgroud)

用于精美打印AST的命令:

$ clang++ -Xclang -ast-print -fsyntax-only test.cpp
Run Code Online (Sandbox Code Playgroud)

Clang-5.0输出:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信这是OP正在寻找的最佳答案(与其他替代方案相比)。 (2认同)

Job*_*Job 34

如果要查看程序集输出,请使用以下命令:

g++ -S file.cpp
Run Code Online (Sandbox Code Playgroud)

如果你想看到GCC生成的一些(伪)C++代码,你可以使用:

g++ -fdump-tree-original file.cpp
Run Code Online (Sandbox Code Playgroud)

对于你的add功能,这将输出类似的东西

;; Function T add(const T&, const T&) [with T = int] (null)
;; enabled by -tree-original

return <retval> = (int) *l + (int) *r;
Run Code Online (Sandbox Code Playgroud)

(我通过引用传递参数,使输出更有趣)


qdo*_*dot 21

你可以使用"-S"选项看到g ++生成的汇编代码.

我认为不可能显示"C++"等效模板代码 - 但我仍然希望g ++开发人员能够为什么编写代码 - 我不知道gcc的架构.

使用汇编时,您可以查看生成的代码,查找与您的函数类似的内容.运行gcc -S -O1 {yourcode.cpp}后,我得到了这个(AMD64,gcc 4.4.4)

_Z3addIiET_S0_S0_:
.LFB2:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    leal    (%rsi,%rdi), %eax
    ret
    .cfi_endproc
Run Code Online (Sandbox Code Playgroud)

这真的只是一个int添加(leal).

现在,如何解码c ++名称mangler?有一个名为c ++ filt的实用程序,你粘贴规范(C等效)名称,你得到解码的c ++等价物

qdot@nightfly /dev/shm $ c++filt 
_Z3addIiET_S0_S0_ 
int add<int>(int, int)
Run Code Online (Sandbox Code Playgroud)

  • 好吧,人们可以看到生成的组件,它已经相当多了,但是,有时它只是你需要获得有价值的见解. (5认同)
  • @qdot 看到程序集和 C++ 生成的代码是完全不同的。有时您想使用 TypeLists 生成类的层次结构,那么您可能需要将结果视为 C++ 代码,以确保在您的层次结构中。在这种情况下,组装根本没有帮助。 (2认同)

Ser*_*eyA 17

现在有一个在线工具可以为您执行此操作:https : //cppinsights.io/例如,此代码

template<class X, class Y> auto add(X x, Y y) {
  return x + y;
}

int main()
{
  return add(10, 2.5);
}
Run Code Online (Sandbox Code Playgroud)

被翻译成

template<class X, class Y> auto add(X x, Y y) {
  return x + y;
}

/* First instantiated from: insights.cpp:9 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
double add<int, double>(int x, double y)
{
  return static_cast<double>(x) + y;
}
#endif


int main()
{
  return static_cast<int>(add(10, 2.5));
}
Run Code Online (Sandbox Code Playgroud)