У меня есть класс, который содержит большой объем данных, называемый 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);
// Метод 1DataManager(const HeavyData& one, const HeavyData& two);
// Метод 2
Проблема заключается в выборе конструктора из приведенного выше двух. Какой из них, по вашему мнению, более эффективен? И почему ?
Думайте, что второй конструктор (метод 2) более эффективен.
Возможно, разбрызгивание отладочных выходов 'std :: cout' для подтверждения/отклонения ваших подозрений. – WhozCraig
Почему, по-вашему, вторая эффективнее? –
Используйте std :: vector в 'HeavyData' и следуйте правилу 0. Он добавит семантику перемещения в «HeavyData», чтобы вы могли перемещать аргументы в 'DataManager' – hansmaad