使用指針的優點通過3DH進行了概述:延遲初始化,減少頭依賴性和控制對象的生命週期。
這也是缺點。當你有一個指針數據成員時,你可能必須編寫自己的拷貝構造函數和賦值操作符,以確保正確創建了該對象的副本。當然,你也必須記得刪除析構函數中的對象。另外,如果您將指針數據成員添加到現有類中,則必須記得更新複製構造函數和運算符=。總之,擁有一個指針數據成員對你來說更有用。
另一個缺點是控制指針指向的對象的生命期的另一個缺點。當對象被銷燬時,非指針數據成員會被自動銷燬,這意味着只要對象存在,就可以確保它們存在。隨着指針,你必須檢查它是否爲nullptr
,這意味着你必須確保將它設置爲nullptr
,只要它不指向任何東西。必須處理所有這些可能很容易導致錯誤。
最後,訪問非指針成員可能會更快,因爲它們在內存中是連續的。另一方面,訪問指向堆中分配的對象的指針數據成員很可能會導致緩存未命中,從而導致緩慢。
你的問題沒有單一的答案。你必須看看你的設計,並決定指針數據成員的優點是否超過額外的頭痛。如果減少編譯時間和標頭依賴性非常重要,請使用pimpl idiom。如果您的數據成員在某些情況下可能不需要您的對象,請使用指針並在需要時進行分配。如果這聽起來不像是令人信服的理由,並且你不想做額外的工作,那麼不要使用指針。
對於惰性初始化,我會建議儘可能使用`boost :: optional`。它比指針更安全,因爲你不能對它進行算術運算。 – 2009-07-24 03:55:12
但許多人(像我)不使用Boost--所以這是一個非常平臺和框架獨立的方式;-) ...我例如只使用Qt :-) – 3DH 2009-07-24 03:59:32