Why do two functions have the same address?(为什么两个函数的地址相同?)
问题描述
考虑这个函数模板:
template<typename T>
unsigned long f(void *) { return 0;}
现在,我将 f 和 f 的地址打印为:
Now, I print the addresses of f<A> and f<B> as:
std::cout << (void*)f<A> << std::endl;
std::cout << (void*)f<B> << std::endl;
如果在 MSVS10 中编译,为什么它们打印相同的地址?它们不是两个不同的功能,因此应该打印不同的地址吗?
Why do they print the same address if compiled in MSVS10? Are they not two different functions and therefore should print different addresses?
更新:
我意识到在 ideone 上,它会打印不同的地址.MSVS10 优化了代码,因为该函数不以任何方式依赖 T,因此它产生相同的函数.@Mark 对此的回答和评论很有价值.:-)
I realized that on ideone, it prints the different address. MSVS10 optimizes the code, as the function doesn't depend on T in any way, so it produces same function. @Mark's answer and comments on this are valuable. :-)
推荐答案
由于函数不依赖模板参数,编译器可以将所有实例化为一个函数.
Since the function doesn't depend on the template parameter, the compiler can condense all instantiations into a single function.
我不知道你为什么得到 1 作为地址.
I don't know why you get 1 for the address.
我用我的真实代码进行了试验,并得出结论,@Mark 上面所说的在这里非常重要:
I experimented with my real code, and concluded that what @Mark said above is very important here :
由于函数不依赖于模板参数,编译器可以将所有实例化为一个函数.
我还得出一个结论,如果函数体依赖于T*,而不是T,它仍然为我的不同类型参数生成相同的函数真正的代码(虽然不是在 ideone 上).然而,如果它依赖于 T,那么它会产生不同的函数,因为 sizeof(T) 对于不同的类型参数是不同的(对我来说很幸运).
I also came to a conclusion that if the function-body depends on T*, not on T, it still produces the same function for different type arguments in my real code (not on ideone, though). However, if it depends on T, then it produces different functions, because sizeof(T) differs (fortunately for me) for different type arguments.
所以我在函数模板中添加了一个 T 类型的虚拟 automatic 变量,这样函数就可以依赖于 T 的大小从而强制它产生不同的功能.
So I added a dummy automatic variable of type T in the function template, so that the function could depend on the size of T so as to force it to produce different functions.
这篇关于为什么两个函数的地址相同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么两个函数的地址相同?
基础教程推荐
- 我有静态或动态 boost 库吗? 2021-01-01
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 常量变量在标题中不起作用 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
