函数指针相等和函数合并
问题:
不同的函数可以有相同的值吗地址?例如, &foo 和 &bar 保证不相等,而 &foo
答案:
C 标准允许实现优化具有相同定义的函数并将它们合并为单个函数。这意味着两个这样的函数的地址可能不相同。
标准合规性:
关于函数指针相等的缺陷报告 1400 承认了这种优化,但表明它不是明确标准是否需要明确解决这个问题。委员会的回应指出,实现可以在“假设”规则的限制内自由优化。
“假设”规则:
下根据“as-if”规则,实现可以模拟可观察的行为,而无需遵守特定的实现细节。由于函数的地址没有明确要求不同,因此这种优化并不违反规则。
相等运算符:
根据标准第 5.10 节,两个如果指针都为空、指向同一函数或表示同一地址,则它们比较相等。这允许实现将相同的地址分配给两个具有相同定义的函数。
观察:
Keith Thompson 指出打印 &foo == &bar 的结果是可观察的行为。通过合并函数更改可观察的行为可能会破坏此类程序。
此外,
过程间优化:
GCC 开发人员 Jan Hubička 确认将相同的函数折叠到相同的地址是不合格行为。它破坏了 GCC 预编译头代码中依赖地址比较的某些部分。
结论:
虽然标准没有明确禁止合并相同函数的优化,但它重要的是要考虑对依赖于不同函数地址的代码的潜在影响。实现应谨慎对待这种优化,并在可观察行为受到影响的情况下避免使用它。
以上是不同的 C 函数可以具有相同的地址吗?的详细内容。更多信息请关注PHP中文网其他相关文章!