Обратите внимание:
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
.Почему это так?
Я использовал Проводник компилятора для создания сборки.