c++ - 为什么不使用类型信息时会生成模板的重复实现?
问题描述
考虑:
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来生成程序集。
解决方案
推荐阅读
- python - Pygame没有检测到鼠标点击
- c# - 是否可以通过使用 Task.Delay 强制一个新线程来确定任务的并行性?
- android - Firebase 未检测到我的颤振应用程序,并且无法发送推送通知
- java - 强制对象字段仅具有从父类继承的某些值
- r - 在 ggplot 地图中表示不同的图层!R
- r - 如何在 r 中更改和/或分离图形图例中的组件?
- python - 仅删除在 Python 中某个时间之前创建的目录
- python - 查找包含特定类(python、selenium、chromedriver)的 xpath 的问题
- python - 是否有可能知道文本何时超出其块?
- python - 如何绘制 3 个变量的概率密度函数