为了账号安全,请及时绑定邮箱和手机立即绑定

不同的功能是否具有不同的地址?

不同的功能是否具有不同的地址?

C++
森林海 2019-10-11 09:59:21
考虑以下两个功能:void foo() {}void bar() {}可以保证&foo != &bar吗?同样,template<class T> void foo() { }可以保证&foo<int> != &foo<double>吗?我知道折叠功能定义有两个链接器。MSVC积极地将COMDAT折叠功能,因此可以将具有相同实现的两个功能转换为一个功能。副作用是,两个函数共享相同的地址。我当时以为这是非法的,但我找不到标准中将其规定为非法的地方。黄金链接器还会折叠带有safe和的功能all。  safe表示如果使用功能地址,则不折叠,all即使使用地址也将折叠。因此safe,如果函数具有不同的地址,金的折痕就表现出来。虽然折叠可能是意料之外的,并且代码依赖于具有不同地址的不同(相同实现)函数(因此折叠可能很危险),但是在当前的C ++标准下,它实际上是非法的吗?(此时为C ++ 14)(自然,如果safe折叠合法)
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

5.10平等经营者 [expr.eq]

1 ==(等于)和!=(不等于)运算符组从左到右。操作数应具有算术,枚举,指针或指向成员类型或type的指针std::nullptr_t。运算符==和!=两者都产生true或false,即type的结果bool。在下面的每种情况下,在应用了指定的转换之后,操作数应具有相同的类型。

2 如果至少一个操作数是一个指针,则对两个操作数都执行指针转换(4.10)和限定转换(4.4),以使其变为其复合指针类型(第5条)。比较指针的定义如下:如果两个指针都为null,都指向相同的函数或都表示相同的地址(3.9.2),则两个指针比较相等,否则,它们比较不相等。


让我们逐点看一下:


两个空指针比较相等。

对您的理智有好处。

指向同一函数的两个指针比较相等。

其他任何事情都将非常令人惊讶。

这也意味着任何inline功能只能有一个离线版本的地址,除非您想使功能指针比较非常复杂和昂贵。

两者代表相同的地址。

现在,这就是全部。将其删除并简化if and only if为一个简单的if解释就可以了,但这是使两个函数完全相同的明确要求,只要它不会改变一致性程序的可观察行为即可。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 302 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信