2014-01-08 34 views
0

我有一個包含大量數據的類,名爲HeavyData。這個類遵循三條規則(它具有 覆蓋了複製構造函數,複製賦值運算符和析構函數,以便能夠在複製類時正確地複製成員變量someBigAmountOfData ,並且能夠在不導致內存的情況下釋放該類泄漏)。傳遞一個包含動態內存的類:方法及其效率

DataManager類有兩個類型爲HeavyData的成員變量。 (見下文)

class HeavyData 
{ 
public: 
    HeavyData(); 

    HeavyData(const HeavyData& that); 
    HeavyData& operator=(const HeavyData& that); 
    ~HeavyData(); 

private: 
    void* someBigAmountOfData; //maybe a few hundred bytes (on the heap, of course) 
    size_t sizeOfData; 
}; 


class DataManager 
{ 
public: 
    DataManager(); 

    //method 1 
    DataManager(HeavyData one, HeavyData two): 
     one(one), 
     two(two) 
    { 
    } 

    //method 2 (which I think is more effective than method 1) 
    DataManager(const HeavyData& one, const HeavyData& two): 
     one(one), 
     two(two) 
    { 
    } 

private: 
    HeavyData one; 
    HeavyData two; 
}; 

該問題:

DataManager類有兩個構造函數如下:

  1. DataManager(HeavyData one, HeavyData two);//方法1

  2. DataManager(const HeavyData& one, const HeavyData& two);//方法2

問題在於從上面兩個選擇構造函數。你認爲哪一個更有效率?爲什麼?

認爲第二個構造函數(方法2)更高效。

+1

也許是一堆'std :: cout'調試輸出來確認/否認你的懷疑。 – WhozCraig

+1

爲什麼你認爲第二個更有效率? –

+1

在'HeavyData'中使用std :: vector並遵循零規則。它會將移動語義添加到'HeavyData'中,以便將參數移動到'DataManager'中 – hansmaad

回答

0

傳遞const引用將避免額外的副本作爲堆棧值。然而,施工期間成員變量的分配也會複製。也許更好:使用shared_ptr來分配你的HeavyData,並傳遞它(從不復制它開始!)。當然,這取決於我們在說些什麼。

標準建議當然適用:嘗試兩種方法,並逐步完成複製。自己衡量表現!

0

使用指針並通過引用傳遞參數總是比傳遞值更好。 通過這種方式,您將能夠使用run time polymorphism的許多功能,並避免創建額外的HeavyData變量。