哪個構造函數更適合以下類?在構造函數中通過值或const引用傳遞的參數
struct Foo
{
Foo(const int& val):val_(val){} // constructor 1
Foo(int val):val_(val){} // constructor 2
int val_;
};
沒有任何的編譯器優化,做自己複製VAL只有一次或者不構造2創建初始化列表之前另一份?
哪個構造函數更適合以下類?在構造函數中通過值或const引用傳遞的參數
struct Foo
{
Foo(const int& val):val_(val){} // constructor 1
Foo(int val):val_(val){} // constructor 2
int val_;
};
沒有任何的編譯器優化,做自己複製VAL只有一次或者不構造2創建初始化列表之前另一份?
如果第一個構造函數被調用,傳遞給它的參數將被複制而不是。 val
參數將綁定到傳遞的參數(copy by reference)。
如果調用第二個構造函數,則傳遞給它的參數將爲,其值爲。
兩個構造函數都相同,它們分別初始化_val
和val
,並按值執行額外的複製。
所以,沒有任何的優化,它看起來像這樣:
Copies
const int& constructor 1
int constructor 2
基本上,構造2做一個拷貝兩次:第一次通話和intialization第二次。 另一方面,您瞭解引用不過是一個指針,並且隨着引用變量的大小減小到指針大小,在引用因子1和2之間沒有成本降低。
雖然其中一個副本可以被刪除。 – juanchopanza
是的,這是我的猜測。所以,第二次做一個沒有優化的副本。因此,對於大對象更好的第一個解決方案。或者,甚至更好的是直接傳遞一個int &&。 –
通常,您從不需要通過int
變量通過const引用。
真正的問題是:你爲什麼在意?如果Foo
構建在循環內部,並且迭代次數很多,那麼只會有可測量的速度差異。和它幾乎是發生在循環內部的唯一事情 - 非常不可能。
所以就使用#2。不是因爲效率,而是因爲它更簡單。
int只是爲了簡單。使用模板參數而不是int。我的問題是如果編譯器沒有執行copy-elision,那麼拷貝的數量是多少 –
這在技術上是正確的。然而,引用可能會被編譯爲一個指針,這意味着*指針*必須被複制而不是值。 –