函数指针相等和不同地址
问题:
在 C 中,是函数指针对于保证具有不同地址的不同函数?具体来说,对于以下代码:
void foo() {} void bar() {} template<class T> void foo() { }
&foo != &bar 和 &foo
答案:
标准没有明确要求不同函数的函数指针具有不同的地址。但是,它确实允许实现优化具有相同定义的函数,并且这种优化可能会导致相同的函数地址。
事实上,Microsoft Visual C (MSVC) 积极折叠具有相同实现的函数,为它们分配相同的地址。这种行为被认为是不合格的。
另一方面,Gold 链接器提供了更安全的设置,可以为函数维护不同的地址,即使它们具有相同的定义。
详细解释:
C 标准将函数指针的相等性定义为如下:
后一个条件为实现别名不同的函数提供了自由度,并且没有明确要求指向不同函数的指针不相等。
但是,获取函数的地址是可观察的行为,更改地址可能会违反“as-if”规则。该规则要求实现的行为与标准中指定的行为无法区分。
因此,虽然标准没有明确禁止函数地址别名,但可以说它违反了“as-if”规则,导致不合格
观察:
结论:
虽然标准允许函数地址别名,但通常建议避免这种优化,因为它会产生可移植性和可靠性问题.
以上是不同的 C 函数是否始终具有不同的函数指针地址?的详细内容。更多信息请关注PHP中文网其他相关文章!