【发布时间】:2017-12-05 00:06:18
【问题描述】:
在我的工作中,我使用 Eigen 数学库。我遇到了这样一种行为:在我自己的类的初始化列表中使用 Eigen Matrix 复制构造函数比在构造函数主体中使用 operator= 慢得多。
在这些示例中,“矩阵”是一个静态大小的密集矩阵。
class Slow {
public:
Slow(const Matrix &m) : my_matrix{m} {}
private:
Matrix my_matrix;
}
class Fast {
public:
Fast(const Matrix &m) : my_matrix{} {
my_matrix = m;
}
private:
Matrix my_matrix;
}
我的程序经常调用我的类的复制构造函数,上面两个选项之间的性能差异非常明显。我验证了生成的程序集实际上是不同的。
我知道 copy-constructor 和 operator= 不一样,但我无法通过 Eigen 源代码找出为什么一个比另一个快。任何具有 Eigen 专业知识的人都可以权衡导致 operator= 速度如此之快的引擎盖下发生的事情吗?洞察力和/或推荐阅读的链接同样受欢迎。
【问题讨论】:
-
您意识到当您使用
operator=时,您仍然调用了默认构造函数,对吧?您将仅复制构造函数与默认构造函数进行比较,紧随其后的是operator=。 -
是的,没错。