[英]Why do two functions have the same address?
考虑这个功能模板:
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的回答和对此的评论很有价值。 :-)
你需要施放到void *
:
std::cout << (void*)(ftype*)f<A> << std::endl;
std::cout << (void*)(ftype*)f<B> << std::endl;
如果转换为函数指针(或其他几类非void指针),它将被operator<<
for std::ostream
(因此为1
)解释为bool
。
由于该函数不依赖于模板参数,因此编译器可以将所有实例化压缩为单个函数。
我不知道你为什么得到1
的地址。
我试验了我的真实代码,并得出结论,@Mark上面说的内容非常重要:
由于该函数不依赖于模板参数,因此编译器可以将所有实例化压缩为单个函数。
我还得出结论,如果函数体依赖于T*
而不是T
,它仍然会为我的实际代码中的不同类型参数生成相同的函数(不过在ideone上)。 但是,如果它依赖于T
,那么它会产生不同的函数,因为sizeof(T)
)对于不同的类型参数有所不同(幸运的是我)。
所以我在函数模板中添加了一个类型为T
的虚拟自动变量,这样函数就可以依赖于T
的大小来强制它产生不同的函数。
这只是一个未定义行为的情况,因为将指向函数的指针转换为指向对象类型的指针的结果是未定义的。
要检查的更有趣的表达式是f<A> == f<B>
,当且仅当A
和B
引用相同类型时,才应评估为true
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.