首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中使用std::载体的性能损失是什么?

在C++中使用std::载体的性能损失是什么?
EN

Stack Overflow用户
提问于 2013-08-20 18:33:24
回答 7查看 6.9K关注 0票数 9

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

就像。是将数组声明为

代码语言:javascript
复制
double 2dmatrix [10][10]

给我更多的表现

代码语言:javascript
复制
std::vector<std::vector<double> > 2dmatrix(10,std::vector<double>(10,0.0))

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

任何关于这方面的想法都是受欢迎的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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 典型的例子是排序

代码语言:javascript
复制
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
});
票数 14
EN

Stack Overflow用户

发布于 2013-08-20 18:37:12

std::向量的开销是:

  • 堆栈上的3个指针
  • 动态分配(懒散地,也就是说,它直到需要时才分配任何东西)

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

如果您需要一个二维网格,我会将数据分配到一个向量中:std::vector<T>(width * height);。然后,您可以编写许多帮助函数,以获得x和y坐标的元素。(或者您可以编写一个包装类。)

票数 9
EN

Stack Overflow用户

发布于 2013-08-20 18:39:03

如果您没有理由调整数组的大小,并且知道它在编译过程中的大小(正如您在第一个示例中所做的那样),那么对STL模板的更好选择是std::array模板。它为您提供了C样式数组的所有相同好处。

代码语言:javascript
复制
double 2dmatrix[10][10];

// would become

std::array<std::array<double, 10>, 10> 2dmatrix;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18342532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档