【发布时间】:2023-04-05 01:17:02
【问题描述】:
考虑这个函数模板:
template<typename T>
unsigned long f(void *) { return 0;}
现在,我将f<A> 和f<B> 的地址打印为:
std::cout << (void*)f<A> << std::endl;
std::cout << (void*)f<B> << std::endl;
如果在 MSVS10 中编译,为什么它们会打印相同的地址?它们不是两个不同的功能,因此应该打印不同的地址吗?
更新:
我意识到在 ideone 上,它会打印不同的地址。 MSVS10 优化了代码,因为函数不依赖于T,所以它产生相同的函数。 @Mark 对此的回答和 cmets 很有价值。 :-)
【问题讨论】:
-
@NicolBolas:通过链接。点击问题中的
same address。 -
标准是否规定函数必须具有唯一的地址?我认为他们会将其保留为完全未定义(实现定义)以允许编译器优化。
-
当然,如果你把函数体改成依赖于模板类型,那么函数就不再一样了。
-
@MarkRansom:但根据你的说法,它仍然是相同的功能,因为它打印
1。 @bdonlan 的回答似乎是正确的。 -
我建议即使您遵循 bdorian 的建议,您仍然会得到相同的地址,除非函数的签名或主体在某种程度上取决于模板参数。您的原始函数体不依赖于模板参数,但您的第二个版本依赖。
标签: c++ function templates memory-address function-templates