2014-02-20 53 views
-1

性能明智,哪个更快?C++:指针向量与固定大小的数组性能

由new运算符分配的对象指针的向量?

std::vector<Object *> array; 

或者在构造函数中使用new分配的数组?

Object[] objects; 
objects = new objects[64]; 

这个想法是,在每一帧,程序循环每个元素读/写每个元素的值。

编辑:

第二个片段是从XNA书中提取的。我没有使用XNA来编写我的框架,我试图找出在需要速度的应用程序中使用容器的最佳方法。

+0

我没有看到指针,我不认为第二个代码片段甚至是有效的C++。你可能想详细说明你想做什么,因为现在这个问题基本上只能用“是”来回答。 –

回答

4

绝对是第二个。

  • 使用指针向量,该向量的每个单独元素都可以分配到堆上的任何位置。

  • 使用对象数组,所有元素都按顺序存储。这意味着处理器可以在遍历数组时更有效地缓存内存块。

这个概念被称为缓存局部性,指的是你的数据是如何组织相对于内存访问模式和缓存。

正如评论中指出的那样,您的示例都不正确。我假设你的意思是这样的:

std::vector<Object*> vector_of_pointers(size); 

Object *array_of_objects = new Object[size]; 

但是,我担心你可能没有按照你的意图说出你的问题。你没有比较两个类似的东西。一个向量基本上只是一个可以在必要时增长的数组。它与数组一样具有相同的保证,所以如果它存储相同的数据类型,则不应该注意到两者之间的差异。

// Bad cache locality: 
Object **A = new Object*[size]; 
std::vector<Object*> B(size); 

// Good cache locality: 
Object *C = new Object[size]; 
std::vector<Object> D(size); 
+3

我认为值得指出的是,与使用矢量和使用数组不同的是,与使用矢量和使用数组无关,只是关于内存中的对象与内存中连续的指针相关。在对象数组和对象矢量之间,或者在指向对象的指针数组和指向对象的指针向量之间不会有性能差异。 – mattnewport

+0

@mattnewport是的,谢谢,我已经在编辑我的答案了。 – paddy

+0

@paddy矢量的大小参数对我来说是一个新概念。当尺寸参数被设置时,这是否意味着矢量无限期地锁定到那个尺寸?如果超过尺寸限制,会发生什么情况? –