首页 > 解决方案 > 为什么不使用类型信息时会生成模板的重复实现?

问题描述

考虑:

void* global_ptr;

template<typename T>
void set_global_ptr(T* ptr)
{
    global_ptr = ptr;
}

int main()
{
    int foo = 123;
    float bar = 456;
    set_global_ptr(&foo);
    set_global_ptr(&bar);
    return 0;
}

在带有标志的 gcc 8.1 上,-O3 -fno-inline它被编译为:

void set_global_ptr<int>(int*):
  mov QWORD PTR global_ptr[rip], rdi
  ret
void set_global_ptr<float>(float*):
  mov QWORD PTR global_ptr[rip], rdi
  ret
main:
  sub rsp, 24
  lea rdi, [rsp+8]
  mov DWORD PTR [rsp+8], 123
  mov DWORD PTR [rsp+12], 0x43e40000
  call void set_global_ptr<int>(int*)
  lea rdi, [rsp+12]
  call void set_global_ptr<float>(float*)
  xor eax, eax
  add rsp, 24
  ret
global_ptr:
  .zero 8

Clang 6.0 产生类似的东西。我禁用了内联,否则根本不会生成任何函数。

如果不使用该类型或被类型擦除,则只应生成一个实现是有意义的。但是我可以看到生成了两个相同的实现set_global_ptr。这是为什么?

我使用Compiler Explorer来生成程序集。

标签: c++templatescompilation

解决方案


推荐阅读