gpt4 book ai didi

c++ - Eigen 复制构造函数 vs. operator= 性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:23 24 4
gpt4 key购买 nike

在我的工作中,我使用 Eigen 数学库。我遇到过这样一种行为,即在我自己的类的初始化列表中使用特征矩阵复制构造函数比在构造函数主体中使用 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;
}

我的程序经常调用我的类的复制构造函数,上面两个选项之间的性能差异非常明显。我验证生成的程序集实际上是不同的。

我知道复制构造函数和 operator= 不一样,但我很难通过 Eigen 源代码来弄清楚为什么一个比另一个更快。任何具有 Eigen 专业知识的人都可以权衡导致 operator= 如此快的幕后发生的事情吗?同样欢迎深入了解和/或推荐阅读的链接。

最佳答案

在“快速”版本中,拷贝由 Eigen 通过内联、显式循环展开和显式矢量化手动处理。在“慢”的情况下,copy-ctor 归结为:

template<typename T,int Size>
struct storage {
T data[Size];
storage(storage &other)
: data(other.data)
{}
};

我们假设已被编译器适当优化。不幸的是,如果 Size 有点太大,clang 和 gcc 都会将此拷贝实现为对 memcpy 的调用,从而丢失编译时的 Size 信息.另一方面,让编译器处理此拷贝可以实现更高级别的优化,例如在某些情况下临时删除。

关于c++ - Eigen 复制构造函数 vs. operator= 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47644021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com