首页 > 后端开发 > C++ > 不同的 C 函数是否始终具有不同的函数指针地址?

不同的 C 函数是否始终具有不同的函数指针地址?

Mary-Kate Olsen
发布: 2024-12-01 22:39:19
原创
656 人浏览过

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

函数指针相等和不同地址

问题:

在 C 中,是函数指针对于保证具有不同地址的不同函数?具体来说,对于以下代码:

void foo() {}
void bar() {}

template<class T> void foo() { }
登录后复制

&foo != &bar 和 &foo 是? != &foo;保证为真?

答案:

标准没有明确要求不同函数的函数指针具有不同的地址。但是,它确实允许实现优化具有相同定义的函数,并且这种优化可能会导致相同的函数地址。

事实上,Microsoft Visual C (MSVC) 积极折叠具有相同实现的函数,为它们分配相同的地址。这种行为被认为是不合格的。

另一方面,Gold 链接器提供了更安全的设置,可以为函数维护不同的地址,即使它们具有相同的定义。

详细解释:

C 标准将函数指针的相等性定义为如下:

  • 如果两个函数指针指向同一个函数,则比较相等。
  • 或者,如果两个函数指针代表相同的地址,则它们也相等被认为是相等的。

后一个条件为实现别名不同的函数提供了自由度,并且没有明确要求指向不同函数的指针不相等。

但是,获取函数的地址是可观察的行为,更改地址可能会违反“as-if”规则。该规则要求实现的行为与标准中指定的行为无法区分。

因此,虽然标准没有明确禁止函数地址别名,但可以说它违反了“as-if”规则,导致不合格

观察:

  • 更改函数地址可能会破坏依赖唯一函数地址的程序,例如使用函数指针作为唯一值的程序。
  • 一些链接器,包括 Gold 和 LLVM 的 lld,仅在以下情况下才执行避免有问题的地址别名的优化:

结论:

虽然标准允许函数地址别名,但通常建议避免这种优化,因为它会产生可移植性和可靠性问题.

以上是不同的 C 函数是否始终具有不同的函数指针地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板