首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL容器与数组的速度对比

STL容器与数组的速度对比
EN

Stack Overflow用户
提问于 2013-02-21 03:46:02
回答 4查看 1.6K关注 0票数 5

我刚刚开始从事一个速度非常重要的科学项目(HPC)。我目前正在设计数据结构。该项目的核心是一个三维网格的双值,以解决偏微分方程。

由于这里的速度可能比代码的简单性更重要,所以我想知道与通常的C样式数组相比,STL的性能如何。在我的例子中,由于它是一个3D网格,我考虑的是a)一个具有线性索引的一维向量b)一个由3个向量组成的向量或者c)一个一维c样式数组或者d)一个三维c样式数组。

我查找了更老的问题,但我只发现了与构造/销毁有关的问题(这在这里并不重要,因为数据结构只在程序启动时创建一次-快速索引和计算很重要)或不同STL容器的比较。

感谢你的帮助

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-21 04:00:28

很难(甚至不可能)提前说出相对性能会是什么。(在现代机器上,由于局部性差,乘法通常比页面未命中更便宜。在较老的机器上,乘法是昂贵的,而且没有缓存,所以位置不会有什么不同。)

此外,根据机器和库实现的不同,对这个平面向量使用std::vector可能比使用指向内存的简单指针更昂贵(也可能不是--您不能提前知道)。

票数 7
EN

Stack Overflow用户

发布于 2013-02-21 03:49:24

1D和3D阵列的存储器布局将是相同的,并且类似于线性std::vector的存储器布局。我会采用这种方法:一个一维向量和一个内联函数来映射到适当的位置。

另一方面,矢量的矢量具有完全不同的布局,因为矢量中的数据不存储在对象内部,而是动态分配和引用。

票数 3
EN

Stack Overflow用户

发布于 2013-02-21 03:50:24

向量将在内部完成您需要手动完成的工作,以便处理单独大小的原始数组,因此,只要正确使用,向量应该与执行相同任务的原始数组执行相同的操作。

例如,单个向量应该与一维c数组执行相同的操作,向量的向量应该执行与使用原始指针数组时大致相同的操作,指针的每个元素都指向一个数组。

然而,如果3d数组具有统一的维度大小(即,不是参差不齐的数组),则向量支付额外的成本来单独管理它们的大小(例如,它们必须单独地存储它们的大小)。如果在编译时知道任何维度大小,那么最好使用'STL‘容器’std::array arrays`::, because it won't have that unnecessary overhead. You can even have multi-dimentional`:

代码语言:javascript
复制
template<typename T, int Planes, int Rows, Cols>
using Matrix = std::array<std::array<std::array<T,Cols>,Rows>,Planes>;

虽然不是严格要求,但这应该与T arr[Planes][Rows][Cols];相同,但没有原始c数组的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14988617

复制
相关文章

相似问题

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