我刚刚读了一个关于初始化多维向量(question)的问题,而Viktor Sehr和Sbi反而使用单个向量并使用my_vector[x+y*100+z*100*100]
获取元素。为什么是这样?是出于性能原因吗?如果是这样,它如何提高性能?先谢谢你,
编辑:当宽度/高度/深度不相同且可以改变时,这些原因是否仍然适用?
答案 0 :(得分:8)
只有几个原因:
它浪费空间,速度慢(不可预测的内存访问,缓存浪费等),它很麻烦
主要的性能缺点可能是缓存。对于平面阵列,您可以保证内存是连续的 - 缓存很快乐。矢量矢量 - 谁知道!
答案 1 :(得分:4)
如果您在这里看到瓶颈,这个建议是合理的。如果此向量的内存使用或访问速度并不重要,请沿着最简单的道路前进。
你应该看看Boost.MultiArray,它可以为你提供最好的两个世界。
如果由于某种原因你无法使用Boost,我绝对会typedef
:
typedef vector<vector<vector<int> > > My3DIntVector;
My3DIntVector v;
答案 2 :(得分:2)
... Viktor Sehr和Sbi反而使用单个向量,并使用my_vector [x + y * 100 + z * 100 * 100]获取元素。这是为什么?
根据尺寸,如果尺寸固定,则为逻辑推荐。
是出于性能原因吗?如果是这样,它如何提高性能?
考虑:
编辑:当宽度/高度/深度不相同且可以改变时,这些原因是否仍然适用?
调整此(大量!)数组的大小可能非常慢。如果您希望程序最快,您必须了解程序的运行方式。元素的复制和破坏复杂性也是一个考虑因素(当使用比int
更复杂的东西时)。如果你做了很多调整大小或插入/删除,那么展平的向量可能非常慢。
但是,如果其尺寸已修复,则可以比std::vector
更好地 。 std::array
是另一种选择。 (如果你走std::array
的路线,要小心你在堆栈上分配的东西)
答案 3 :(得分:0)
我唯一可以想象的是,这是一个很大的内存块,因此可以防止内存碎片。这更容易缓存。
vector<vector<vector<int> > >
包含大量内存块:第一个向量的块,vector<>
中每个元素的块和vector<vector<>>
中每个元素的块。这不容易缓存,并且可能产生难以预测的内存使用。