C ++:指针向量与固定大小的数组性能

sli*_*les -1 c++ arrays vector game-engine

性能方面,哪个更快?

新操作符分配的对象指针的向量?

std::vector<Object *> array;
Run Code Online (Sandbox Code Playgroud)

还是在构造函数中分配了new的数组?

Object[] objects;
objects = new objects[64];
Run Code Online (Sandbox Code Playgroud)

想法是,在每个帧中,程序都会循环遍历每个元素,以读取/写入每个元素的值。

编辑:

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

pad*_*ddy 5

绝对是第二个。

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

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

该概念称为缓存局部性,指的是数据在内存访问模式和缓存方面的组织程度。

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

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

Object *array_of_objects = new Object[size];
Run Code Online (Sandbox Code Playgroud)

但是,我担心您可能没有按照您的意图表达您的问题。您没有在比较两个相似的东西。向量基本上只是一个数组,必要时可以增长。它与数组具有所有相同的保证,因此,如果存储相同的数据类型,则您不会注意到两者之间的任何区别。

// 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);
Run Code Online (Sandbox Code Playgroud)

  • 我认为值得指出的是,使用向量与使用数组无关,但是,这仅是对象在内存中是连续的,而指针在内存中是连续的。在对象数组和对象向量之间,或在指向对象的指针数组与到对象的指针向量之间,不会有性能差异。 (3认同)