c++ - 克隆函数速度 : if/else vs short circuit evaluation

标签 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()) {}

最佳答案

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

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

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

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 实例的定义,您可能需要为每个 DerivedObject< 编写一个 Invalid* 子类 类型。

关于c++ - 克隆函数速度 : if/else vs short circuit evaluation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20767955/

相关文章:

c++ - 我怎样才能简单地按字母顺序对 wxListCtrl 的项目进行排序?

php - PHP 中的基准内存使用情况

c++ - 用短路操作替换链式 ifs

Ada短路控制表

c++ - 为什么 'if(1 == 1 == 1 == 1 == 1);' 为 TRUE 而 'if(-1 == -1 == -1 == -1 == -1);' 为 FALSE?

c++ - glm::value_ptr 参数太多

c++ - 为什么 map 不包括 out_of_range?

c++ - 如何使用 MSVC 构建 Gnuplot? (syscfg.h(377) : error)

python - 将 mysql db 放入内存

javascript - Mozilla Firefox 中的 svg 滚动性能