Передача класса с динамической памятью: методы и их эффективность

У меня есть класс, который содержит большой объем данных, называется 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-й конструктор (метод 2) более эффективен.

0

Решение

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

Конечно, это стандартный совет: попробуйте и то, и другое. Измерьте производительность и сами!

0

Другие решения

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

0

По вопросам рекламы [email protected]