不同的函数有不同的地址吗?
在 C 中,通常假设具有不同实现的函数具有不同的地址。然而,在某些情况下,这可能并不总是成立。
函数折叠优化
优化编译器可以使用函数折叠将具有相同实现的函数合并到单个实体中。这可能会导致函数共享相同的地址。
虽然 C 标准允许实现执行此类优化,但仍不清楚是否明确允许函数共享相同的地址。
As-if 规则和 Observable 行为
在 as-if 规则下,编译器可以优化代码,如果 observable行为保持不变。获取函数的地址被认为是可观察的行为。
标准解释
缺陷报告 1400 稍微模糊地解决了这个问题。它承认实现可能会别名函数,但对标准的确切解释留下了争议。
观察
有人担心函数折叠可能会破坏依赖于函数的不同地址。例如,如果函数地址被多个函数共享,则使用函数地址作为唯一标识符可能会出现问题。
C11 要求
C11 标准需要 SIG_DFL 和 SIG_ERR 等宏生成与任何可声明函数都不相等的不同值。这表明 C 标准禁止函数具有相同的地址。
最新进展
gcc 开发人员澄清 MSVC 激进的函数折叠违反了标准。此外,llvm-dev 讨论强调,更智能的链接器会避免组合函数,除非函数仅用于调用而不是用于地址观察。
结论
基于可用信息,目前还不清楚当前的 C 标准是否明确禁止或允许函数折叠优化,从而导致相同的函数共享相同的地址。 as-if 规则为编译器提供了优化的自由,但可观察的行为(获取函数地址)应该不受影响。但是,建议谨慎,因为函数折叠可能会破坏依赖不同函数地址的代码。
以上是不同的 C 函数总是具有不同的地址吗?的详细内容。更多信息请关注PHP中文网其他相关文章!