亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

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 關注
  • 336 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號