通常,我想知道标准模板库是否会导致数值/科学计算代码中的性能/速度开销。
就像。是将数组声明为
double 2dmatrix [10][10]给我更多的表现
std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0))对于C在科学计算方面是否比C++具有更好的性能,我也希望有一些一般性的想法。我用STL编写了非常面向对象的代码,并且经常使用C++11。我开始考虑是否应该开始研究纯C,如果它运行得更快。
任何关于这方面的想法都是受欢迎的。
发布于 2013-08-20 18:43:25
给出了它提供的抽象,C++ std::vector的效率和它得到的一样高:堆栈上的3个指针,以及在线性增长场景中平均每个元素进行1次重新分配的动态分配数据(因为调整大小比按比例( 1.5比2)要大得多)。
使用malloc()和realloc()的C等价物至少也同样昂贵,而且更麻烦(手动调整大小等)。此外,std::vector允许用户定义的性能调优通过特殊分配器 (基于池、堆栈分配等)进行,这在C++11中并不像在C++98中那样难用。
如果不需要动态调整大小,则可以同时使用C和C++编写静态数组(或在C++中使用std::array )。
通常,对于高性能的计算,C++具有更大的优化潜力。,特别是通过使用可以内联的函数对象(与常规C函数指针相反)。The 典型的例子是排序
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
});发布于 2013-08-20 18:37:12
std::向量的开销是:
在某些情况下,堆栈分配的数组可能更快(对于少量的数据)。为此,您可以使用std::array<T, Length>。
如果您需要一个二维网格,我会将数据分配到一个向量中:std::vector<T>(width * height);。然后,您可以编写许多帮助函数,以获得x和y坐标的元素。(或者您可以编写一个包装类。)
发布于 2013-08-20 18:39:03
如果您没有理由调整数组的大小,并且知道它在编译过程中的大小(正如您在第一个示例中所做的那样),那么对STL模板的更好选择是std::array模板。它为您提供了C样式数组的所有相同好处。
double 2dmatrix[10][10];
// would become
std::array<std::array<double, 10>, 10> 2dmatrix;https://stackoverflow.com/questions/18342532
复制相似问题