对于64位T,std :: vector <t *> vs std :: vector <t>

时间:2017-04-06 09:40:27

标签: c++ c++11 pointers vector stl

在3D几何引擎代码中,我读到了:

std::vector<GA_Offset*>似乎有误,GA_Offset仅为64位integerstd::vector<GA_Offset>会更好。

其中GA_Offset又名long int是几何结构中元素的可能非连续偏移量。 GA_Offsets保持不变,即使它之前的元素被删除,但如果在它之前插入了一个元素,或者元素列表被碎片整理,它将无效。

在我简短的C ++体验中,我了解到引用和指针比传递值更好。现在我有点困惑。

为什么在std::vector中存储值比指针更好? 64位int有什么区别?

2 个答案:

答案 0 :(得分:3)

传递和存储是两回事。

确实,在传递参数时,通常需要引用。

但是,除非您确实需要,否则存储指针和引用是您不能做的事情。它使事情变得非常复杂,需要仔细的对象生命周期管理。如果你不需要它,你只需存储值,让移动语义处理剩下的事情(对于矢量尤其如此,因为它们取得了元素的所有权)。

在这种情况下,std::vector<GA_Offset*>是否优于std::vector<GA_Offset>完全取决于应用程序。可能是容器故意存放&#34;手柄&#34;出于某些操作原因。我们无法分辨,因为它取决于矢量应该做什么。

答案 1 :(得分:1)

如果std::vector<T>是64位整数,

T确实有意义,因为它的内存布局只是T s的缓存友好连续数组:

+---------+ 
|T|T|...|T|
+---------+

另一方面,std::vector<T*>是一个更复杂的数据结构,您可以连续存储指针;但指向的项目(整数)在内存中是not连续的:

+--------------+ 
|T* | T*|...|T*|
+--------------+
 |   |       |
 \-> \->     \->

因此,vector<T*>对于一个简单的整数vector<T>来说,效率低下并且对T的缓存友好性更低。

我肯定建议将vector<T>用于64位整数T为什么您需要T*

的额外间接级别

此外,在STL容器中存储原始指针时要特别注意。 Raw 观察指针很好;但是原始拥有指针是“漏洞”的来源,你应该考虑存储 smart 拥有指针(例如std::vector<std::unique_ptr<T>>)。但是,对于简单的64位整数类型,这没有多大意义。