Почему дублирующиеся реализации шаблонов генерируются, когда информация о типе не используется? - PullRequest
0 голосов
/ 21 мая 2018

Обратите внимание:

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.Почему это так?

Я использовал Проводник компилятора для создания сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...