在3D几何引擎代码中,我读到了:
std::vector<GA_Offset*>
似乎有误,GA_Offset
仅为64位integer
。
std::vector<GA_Offset>
会更好。
其中GA_Offset
又名long int
是几何结构中元素的可能非连续偏移量。 GA_Offsets
保持不变,即使它之前的元素被删除,但如果在它之前插入了一个元素,或者元素列表被碎片整理,它将无效。
在我简短的C ++体验中,我了解到引用和指针比传递值更好。现在我有点困惑。
为什么在std::vector
中存储值比指针更好? 64位int
有什么区别?
答案 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位整数类型,这没有多大意义。