为什么两个函数具有相同的地址
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<<
解释为std::ostream
的bool
(因此1
(。
由于函数不依赖于模板参数,因此编译器可以将所有实例化压缩到单个函数中。
我不知道为什么你会得到1
地址。
由纳瓦兹添加:
我用我的真实代码进行了实验,得出的结论是,@Mark上面所说的在这里非常重要:
由于函数不依赖于模板参数,因此编译器可以将所有实例化压缩到单个函数中。
我还得出了一个结论,如果函数体依赖于T*
,而不是T
,它仍然为我的实际代码中的不同类型的参数生成相同的函数(尽管不是在ideone上(。但是,如果它取决于 T
,那么它会产生不同的函数,因为对于不同类型的参数sizeof(T)
不同(幸运的是对我来说
所以我在函数模板中添加了一个 T
类型的虚拟自动变量,以便函数可以依赖于T
的大小,从而强制它产生不同的函数。
这只是未定义行为的情况,因为将指向函数的指针转换为指向对象类型的指针的结果是未定义的。
一个更有趣的表达式是f<A> == f<B>
当且仅当A
和B
引用同一类型时,应评估为true
。
相关文章:
- 如何在c++程序中找到函数的地址
- 函数名是c中该函数的第一条指令的地址吗
- 从 C++ 中的函数返回数组地址问题
- 为什么成员函数地址离自由函数这么远?
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么每次执行时函数的地址都不同?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 获取函数的地址?
- 模板到函数的时刻地址是否可以作为指向某个函数的函数指针传递?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 在 gcc/clang (C++) 中获取函数范围之外的标签地址
- 在每个运行时将函数保存到相同的地址
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 如何定义全局函数指针并分配给特定地址
- 常量引用函数参数的地址何时唯一?
- 打印我的Get MAC地址函数的std::字符串时出现意外输出
- 成员函数地址(函数指针)