在C++中使用std :: vector会有什么性能损失?

atm*_*ere 9 c++ performance vector scientific-computing c++11

通常,我很想知道标准模板库是否会在数值/科学计算的代码中产生性能/速度开销.

例如.将数组声明为

double 2dmatrix [10][10]
Run Code Online (Sandbox Code Playgroud)

会给我更多的表现

std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0))
Run Code Online (Sandbox Code Playgroud)

我还要感谢一些一般性的想法,关于C在科学计算方面是否具有比C++更好的性能.我使用STL以非常面向对象的方式编写了我的代码,并且使用了C++ 11.我开始考虑是否应该开始研究纯C,如果它运行得更快.

对此有任何想法都是受欢迎的.

Tem*_*Rex 14

考虑到它提供的抽象,C++ std::vector就像它获得的效率一样:堆栈上有3个指针,动态分配的数据在线性增长情况下平均每个元素重新分配1次(因为调整大小比按比例扩展容量,因子为1.5至2).

C等价物使用malloc()realloc()将至少同样昂贵,并且更加繁琐(手动调整大小等).此外,它std::vector允许通过特殊分配器(基于池,堆栈分配等)进行用户定义的性能调优,这在C++ 11中并不像在C++ 98中那样难以使用.

如果不需要动态调整大小,可以在C和C++中编写静态数组(或std::array在C++中).

通常,对于高性能计算,C++具有更多的优化潜力,特别是通过使用可以内联的函数对象(与常规C函数指针相比​​).的典型的例子是排序

int comp( const void* a, const void* b ) {
    return /* your comparison here */;
}

// C style sorting
qsort( arr, LARGE_SIZE, sizeof( int ), comp ); 
                                       ^^^^ <---- no-inlining through function pointer

// C++11 style sorting (use hand-made function object for C++98
std::sort(std::begin(arr), std::end(arr), [](auto a, auto b) { 
    return comp(&a, &b);
           ^^^^ <----- C++11 lambdas can be fully inlined
});
Run Code Online (Sandbox Code Playgroud)

  • 关于C++ 11的东西+1.内联很重要,`std :: array` ftw (3认同)

Sta*_*ked 8

std :: vector的开销是:

  • 堆栈上有3个指针
  • 动态分配(懒惰,即在需要之前不分配任何东西)

在某些情况下(对于少量数据),堆栈分配的阵列可能更快.为此您可以使用std::array<T, Length>.

如果你需要一个二维网格,我会在一个向量中分配数据:std::vector<T>(width * height);.然后你可以编写一些辅助函数来通过x和y坐标获取元素.(或者你可以写一个包装类.)

  • 为什么你说"少量数据"?那么std :: array的性能与"double 2dmatrix [10] [10]"相同吗?我实际上操作非常大的矩阵. (2认同)
  • 如果您有大量数据,那么您不应该在堆栈上分配它,因为这可能会导致堆栈溢出.此外,std :: array的性能优势随着它变大而减小. (2认同)
  • @StackedCrooked:这就是我说的:D (2认同)