Я настраиваю алгоритм, который анализирует большие объемы данных, чтобы он работал немного быстрее. Это делает интенсивное использование clone
функции, подобные следующим:
const Object* clone() const {
if (this != INVALID_OBJECT) {
return new DerivedObject(*this);
} else {
return this;
}
}
Алгоритм использует указатель на один недопустимый объект, чтобы значительно уменьшить требования к памяти, и передача его через конструктор копирования приведет к потере цели.
Мой вопрос заключается в том, увеличит ли использование оценки короткого замыкания производительность clone
Функции за счет сокращения времени выполнения:
const Object* clone() const {
const Object* clonedObject = INVALID_OBJECT;
(void)((this != INVALID_OBJECT)&&(clonedObject = new DerivedObject(*this));
return clonedObject;
}
Есть ли способ сократить время выполнения clone
функции? Конструкторы копирования обычно следуют шаблону
DerivedObject(const DerivedObject& derivedObj) : Object(derivedObj.getField1()),
field2(derivedObj.getField2()) {}
Ваша оптимизация, какой бы сложной она ни казалась, на самом деле тривиальна в том смысле, что она, вероятно, генерирует тот же код, что и предыдущий.
Подумайте о низкоуровневых операциях, а не о синтаксисе: одно условие, одна ветвь. Трудно сделать меньше.
ОБНОВИТЬЯ заметил, что на самом деле я не ответил на ваш вопрос: это можно сделать быстрее? Ну да! Вы можете написать подкласс только для неинициализированного значения.
class InvalidObject : public Object
{
public:
const Object* clone() const {
return this;
}
};
И сделать глобальный INVALID_OBJECT
экземпляр этого класса:
Object *INVALID_OBJECT = new InvalidObject();
Теперь вам не нужно условие в любом из clone()
Переопределение:
class DerivedObject : public Object
{
public:
const Object* clone() const {
return new DerivedObject(*this);
}
};
Естественно, в зависимости от структуры вашей иерархии и определения вашего INVALID_OBJECT
Например, вам может понадобиться написать Invalid*
подкласс для каждого DerivedObject
тип.
Других решений пока нет …