我有一個關于c shared_ptr的瑣碎問題。請考慮一下下面的偽代碼,
class Foo{
int run()。
}
class Bar{
// NOTE:回傳一個shared_ptr,而不是一個const ref。
shared_ptr<Foo> GetFoo() const>。
}
酒吧{...}。
int k = bar.GetFoo()->run() 。
在這種情況下,當我們呼叫bar.GetFoo()時,一個shared_ptr<Foo>是否會被物化(即創建一個atomic_counter,等等)?
uj5u.com熱心網友回復:
語言的規則要求shared_ptr<Foo>被物化,即使它被立即丟棄了。呼叫 ->run() 只會影響 when 臨時被物化,而不是 whether。
在實踐中,關于何時臨時物件被物體化的規則實際上只是關于誰必須為臨時物件分配記憶體的規則。臨時物件的構造發生在GetFoo甚至回傳之前,就像C 17之前一樣。這是因為只有 GetFoo 或它的一個呼叫者實際上知道如何執行構建(e.g. 哪些引數要傳遞給 shared_ptr 構造器)。
綜上所述,只有當編譯器能夠證明物化并不改變程式的可觀察行為時,物化才能被省略。由于shared_ptr相當復雜(它有一個帶有原子計數器的控制塊,你似乎也知道),編譯器不太可能證明這一點。事實上,即使創建shared_ptr的函式的定義位于同一個翻譯單元中,它似乎,shared_ptr物件的初始化和銷毀只是被行內,而不是被洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331851.html
標籤:
上一篇:如何在生成輸入時使輸入欄位可編輯
