2011-12-21 61 views
0

我有一個名爲Texture的類,它有一個指向SDL_Surface的指針。當我想將它添加到一個向量中時,我需要有一個非默認的拷貝構造函數來防止當原始文件超出範圍時出現問題。我知道,只要對象通過值傳遞給函數,就會調用複製構造函數。將每個幀通過值傳遞給我的渲染函數的許多Texture對象會導致我的程序變慢?我知道我可以通過引用來避免這個問題,但我希望儘可能保留我現有的代碼。非默認拷貝構造函數會減慢我的程序嗎?

+1

你爲什麼不測量它並告訴我們? – 2011-12-21 06:17:50

+0

顯式拷貝構造函數有多強烈?管理性能的最大空間是擁有一個明確的拷貝構造函數。對默認沒有什麼魔力。 – wallyk 2011-12-21 06:18:12

+0

當然,在我寫代碼之前,我只是希望知道。另外,當我創建我的拷貝構造函數時,是否必須初始化所有變量或只是指針。如果我只是使用指針,其餘的會自動複製? – Alidaco 2011-12-21 06:19:49

回答

2

首先,如果你真的關心性能,那麼你應該四處傳遞引用,路過的值可以,如果你使用默認或自定義拷貝構造函數會非常昂貴,不管。

現在,如果你完全在按值傳遞的東西,並使用拷貝構造函數集,我覺得默認的拷貝構造函數是好的,因爲它需要照顧一切爲您服務。如果可能的話,你應該嘗試調整你的課程,以便繼續使用它。

如果你的類有指針,再一個方法是將它們包裝某種智能指針內。例如,如果代替SDL_Surface*使用std::shared_ptr<SDL_Surface>(或boost::shared_ptr<SDL_Surface>這是相同的),那麼啓用該指針被複制。 shared_ptr類將保持引用計數,並且只有在所有引用都消失時才刪除表面。請注意,如果您使用此方法,則需要爲SDL_Surface使用自定義刪除功能,如this question中所示。

+0

非常感謝。我將開始通過引用傳遞,並查看一些智能指針。 – Alidaco 2011-12-21 07:52:15