2014-01-08 5 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

Используйте std :: vector в 'HeavyData' и следуйте правилу 0. Он добавит семантику перемещения в «HeavyData», чтобы вы могли перемещать аргументы в 'DataManager' – hansmaad

ответ

0

Передача по заданию const поможет избежать дополнительной копии в виде значений стека. однако, назначение переменной-члена во время строительства также копирует. возможно, лучше: используйте shared_ptr, чтобы выделить HeavyData, и передайте это (никогда не копируйте его для начала!). конечно, это зависит от того, как мы говорим Тяжелый.

Стандартные рекомендации применяются, конечно же: попробуйте оба и выполните процедуру копирования. измерьте производительность самостоятельно, тоже!

0

Использование указателя и передача аргумента по ссылке всегда лучше, чем передача значения. Таким образом вы сможете использовать многие функции run time polymorphism, а также избегать создания дополнительной переменной HeavyData.

 Смежные вопросы

  • Нет связанных вопросов^_^