У меня есть класс, который содержит большой объем данных, называется 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
Класс имеет два конструктора следующим образом:
DataManager(HeavyData one, HeavyData two);
// метод 1
DataManager(const HeavyData& one, const HeavyData& two);
// метод 2
Проблема заключается в выборе конструктора из вышеупомянутых двух. Какой из них вы считаете более эффективным? И почему ?
Думаю, что 2-й конструктор (метод 2) более эффективен.
передача по константной ссылке позволит избежать дополнительной копии в качестве значений стека. однако присвоение переменной-члена во время построения также копирует. может быть, лучше: используйте shared_ptr для выделения ваших HeavyData и передавайте их (никогда не копируйте их для начала!). конечно, это зависит от того, как тяжело мы говорим.
Конечно, это стандартный совет: попробуйте и то, и другое. Измерьте производительность и сами!
Использование указателя и передача аргумента по ссылке всегда лучше, чем передача значения.
Таким образом, вы сможете использовать многие функции run time polymorphism
и это также избегает создания дополнительных HeavyData
переменная.