在科学计算的背景下,C ++ 11 move语义会产生什么影响?


10

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 move语义会产生什么影响?

我对这个问题很感兴趣,但更具体地说,我对使用Boost库编写的有限元代码的移动语义也很感兴趣。我使用增强版1.47.0(因为增强版发行说明中提到了移动语义是在1.48.0中引入的)和增强版1.53.0 (使用增强版1.47.0)测试了自己的一些C ++ 03代码,但是我没有注意到太多改进。我想任何积蓄从不必为做复制建筑boost::numeric::ublas::vector/ matrixboost::function不显着的,因为求解系统矩阵构成块体的工作量。

编辑:实际上,似乎只为移动语义实现了boost::function(请参见1.52.0版发行说明)。中没有提到移动语义boost::numeric,我将源代码拼凑起来以确保没有似乎右值引用。


1
正如您在问题的最后一部分中所指出的那样,除非您已对代码进行了概要分析并看到了很多复制工作,否则您无法通过使用移动语义来显着提高性能。
Bill Barth

Answers:


10

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

现在受到限制的原因大型有限元程序包要谨慎地编写可移植的代码,因此它们尚未在其自己的代码中使用C ++ 11语言构造。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.