C++11 移动语义在科学计算环境中的影响是什么?

计算科学 有限元 表现 C++
2021-12-14 05:55:11

C++11 引入了移动语义,例如,它可以在 C++03 需要执行复制构造或复制分配的情况下提高代码性能。本文报告说,以下代码在使用 C+11 编译时速度提高了 5 倍:

vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
    vector<int> x(1000);
    V.push_back(x);
}

C++11 移动语义在科学计算环境中的影响是什么?

我对这个问题很感兴趣,但更具体地说,我也对使用 boost 库编写的有限元代码的移动语义感兴趣。我使用 boost 版本 1.47.0(因为boost 发行说明提到移动语义在 1.48.0 中引入)和 boost 版本 1.53.0测试了我自己的一些 C++03 代码,但我没有注意到有太大的改进。我猜由于解决系统矩阵构成了大部分工作量,因此不必为boost::numeric::ublas::vector/matrix进行复制构造所节省的任何费用并不明显。boost::function

编辑:实际上看起来移动语义仅适用于boost::function(请参阅版本 1.52.0 发行说明)。中没有提到移动语义boost::numeric,我对来源进行了检查以确保似乎没有右值引用。

1个回答

我认为在实践中影响是有限的,而且将会是有限的。

现在它受到限制的原因是大型有限元包非常小心地编写可移植的代码,因此它们尚未在自己的代码中使用 C++11 语言结构。

当然,他们将受益于您所展示的代码,即使无需更改源代码,您也会受益于改进的编译器支持库,例如用于 GCC 的 libstdc++。也就是说,科学计算领域的人非常清楚复制的成本,因此,对于重要的对象,他们根本不复制——他们要么就地生成,要么做浅拷贝,要么使用共享指针或许多其他可用于避免复制开销的技术。换句话说,发明移动语义的情况实际上并不经常发生在“真实的”科学代码中。