克隆功能速度:if / else vs短路评估

时间:2013-12-25 00:03:34

标签: c++ performance short-circuiting

我正在调整一种分析大量数据的算法,以使其运行速度更快一些。它大量使用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 个答案:

答案 0 :(得分:3)

您的优化(看起来很复杂)实际上是微不足道的,因为它可能会发出与前一个相同的代码。

考虑低级操作,而不是语法:一个条件,一个分支。很难少做。

更新:我注意到我没有真正回答你的问题:可以更快地完成吗?嗯,是!您可以只为未初始化的值编写子类。

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子类。