Скорость функции клонирования: если / иначе против оценки короткого замыкания

Я настраиваю алгоритм, который анализирует большие объемы данных, чтобы он работал немного быстрее. Это делает интенсивное использование 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()) {}

1

Решение

Ваша оптимизация, какой бы сложной она ни казалась, на самом деле тривиальна в том смысле, что она, вероятно, генерирует тот же код, что и предыдущий.

Подумайте о низкоуровневых операциях, а не о синтаксисе: одно условие, одна ветвь. Трудно сделать меньше.

ОБНОВИТЬЯ заметил, что на самом деле я не ответил на ваш вопрос: это можно сделать быстрее? Ну да! Вы можете написать подкласс только для неинициализированного значения.

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 тип.

3

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

Других решений пока нет …

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