7

是否可以保证仅通过名称(也不是参数和返回类型)不同的函数不能在 C 和 C++ 中共享相同的地址?我在标准中没有看到任何关于它的内容。

#include <cassert>

void foo() {}

void bar() {}

int main()
{
    assert(foo != bar);
}
4

4 回答 4

7

C++11 标准说

5.10 相等运算符
可以比较相同类型的指针(指针转换后)是否相等。相同类型的两个指针比较相等当且仅当它们都为空、都指向相同的函数或都表示相同的地址 (3.9.2)。

如果您没有任何指向函数的指针,它们可能具有相同的地址,但我们不知道。如果要比较指向两个不同函数的指针,它们不能比较相等。


造成混淆的一个原因可能是已知 MSVC 编译器会组合模板函数的代码,而这些模板函数恰好为不同类型(如intlong)生成相同的机器代码。这是不合规的。

但是,这是针对具有不同签名的函数,而不是这个问题的确切含义。

于 2012-08-28T20:52:19.480 回答
3

是的。C99 6.5.10:6

两个指针比较相等当且仅当两者都是空指针,都是指向同一个对象(包括指向对象的指针和其开头的子对象)或函数的指针,...</p>

编辑:本段的其余部分,因为事实证明它具有一定的重要性:

两者都是指向同一数组对象最后一个元素之后的指针,或者一个是指向一个数组对象末尾之后的指针,另一个是指向恰好紧随第一个数组对象的不同数组对象开头的指针地址空间中的数组对象。

我从中得到的:

  • 应用到错误的操作数上的相等,用很多话来说,是未指定的。由于无关的原因,它可能是偶然的,但是当你使用它错误时它不是未定义的,当你使用它错误时它<是未定义的。
  • 据我所知,本段的其余部分不适用于函数,因为函数既不是对象,也不能是数组的元素。
于 2012-08-28T20:48:30.667 回答
2

许多打开优化的编译器会使两个函数具有相同的地址。例如,来自msdn

/OPT:ICF可能导致将相同的地址分配给不同的函数或只读数据成员(使用 /Gy 编译的 const 变量)。因此,/OPT:ICF 可以破坏依赖于函数地址或只读数据成员不同的程序。有关详细信息,请参阅 /Gy(启用功能级链接)。

ICF : 相同的代码折叠

于 2012-08-28T20:49:39.690 回答
1

实施细节。

(C99,5.1.2.3p1)“本国际标准中的语义描述描述了抽象机器的行为,其中优化问题无关紧要。”

于 2012-08-28T20:47:30.993 回答