为什么我不应该使用vector<vector<vector<int>>>?
Why Shouldn't I Use vector<vector<vector<int>>>?
我刚刚读到一个关于初始化多维向量的问题(问题),Viktor Sehr和Sbi建议使用单个向量并使用my_vector[x+y*100+z*100*100]
获取元素。为什么会这样?是出于性能原因吗?如果是,它如何提高性能?提前谢谢,好吧。
编辑:当宽度/高度/深度不相同并且可以更改时,这些原因仍然适用吗?
只有几个原因:
它浪费空间,速度慢(不可预测的内存访问、缓存浪费等),很麻烦
主要的性能缺陷可能是缓存。使用平面阵列可以保证内存是连续的——缓存是令人满意的。有了一个又一个矢量——谁知道呢!
如果您在这里看到瓶颈,这个建议是合理的。如果内存使用率或该向量的访问速度并不关键,那么就走最简单的路吧。
你应该看看Boost.MultiArray,它让你两全其美。
如果出于任何原因你不能使用Boost,我肯定会typedef
它:
typedef vector<vector<vector<int> > > My3DIntVector;
My3DIntVector v;
Viktor Sehr和Sbi建议使用单个向量,并使用my_vector[x+y*100+z*100*100]获得元素。为什么会这样?
考虑到尺寸,如果尺寸是固定的,这是合乎逻辑的建议。
是出于性能原因吗?如果是,它如何提高性能?
考虑:
- 创建所有数组所需的分配数
- 复制哪怕一个维度的时间
- 它增加了系统分配器的复杂性
- 释放所需的时间
- 常见操作的复杂性,例如填充
编辑:当宽度/高度/深度不相同并且可以更改时,这些原因仍然适用吗?
调整这个(巨大的!)数组的大小可能非常缓慢。如果你想让你的程序运行得最快,你必须了解它将如何运行。元素的复制和销毁复杂性也是一个考虑因素(当使用比int
更复杂的东西时)。如果你做了大量的调整大小或插入/删除,那么展平的向量可能会非常慢。
但是,如果它的尺寸是固定的,那么可以比std::vector
做得更好。CCD_ 5是一种替代方案。(如果你走std::array
的路线,请小心你在堆栈上分配的内容)
我唯一能想到的是,这是一大块内存,因此可以防止内存碎片化。这更容易缓存。
vector<vector<vector<int> > >
包含许多内存块:第一个向量的块,vector<>
中每个元素的块,以及vector<vector<>>
中每个元件的块。这不容易缓存,并且可能会产生难以预测的内存使用情况。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中