为什么两个函数具有相同的地址

Why do two functions have the same address?

本文关键字:地址 函数 两个 为什么      更新时间:2023-10-16

请考虑以下函数模板:

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::ostreambool(因此1 (。

由于函数不依赖于模板参数,因此编译器可以将所有实例化压缩到单个函数中。

我不知道为什么你会得到1地址。

<小时 />

由纳瓦兹添加:

用我的真实代码进行了实验,得出的结论是,@Mark上面所说的在这里非常重要:

由于函数不依赖于模板参数,因此编译器可以将所有实例化压缩到单个函数中。

我还得出了一个结论,如果函数体依赖于T*,而不是T,它仍然为我的实际代码中的不同类型的参数生成相同的函数(尽管不是在ideone上(。但是,如果它取决于 T ,那么它会产生不同的函数,因为对于不同类型的参数sizeof(T)不同(幸运的是对我来说

(。

所以我在函数模板中添加了一个 T 类型的虚拟自动变量,以便函数可以依赖于T的大小,从而强制它产生不同的函数。

这只是未定义行为的情况,因为将指向函数的指针转换为指向对象类型的指针的结果是未定义的。

一个更有趣的表达式是f<A> == f<B>当且仅当AB引用同一类型时,应评估为true