C++ STL : Array vs Vector: Raw element accessing performance

标签 c++ stl arrays vector

我正在构建一个解释器,因为这次我的目标是原始速度,所以在这种(原始)情况下,每个时钟周期对我来说都很重要。

您是否有任何经验或信息,两者哪个更快: vector 或数组? 重要的是我可以访问元素的速度(操作码接收),我不关心插入、分配、排序等。

我现在要靠在窗外说:

  • 在访问元素 i 方面,数组至少比 vector 快一点。

这对我来说似乎很合乎逻辑。使用 vector ,您可以获得数组不存在的所有安全性和控制开销。

(为什么)我错了吗?

不,我不能忽略性能差异 - 即使它如此 很小 - 我已经优化并最小化了执行操作码的 VM 的所有其他部分:)

最佳答案

std::vector 的典型实现中的元素访问时间与通过 指针对象 可用的普通数组中的元素访问时间相同(即 < em>运行时指针值)

std::vector<int> v;
int *pa;
...
v[i];
pa[i]; 
// Both have the same access time

但是,对作为数组对象可用的数组元素的访问时间比上述两种访问时间都要好(相当于通过编译时访问指针值)

int a[100];
...
a[i];
// Faster than both of the above

例如,通过运行时指针值对 int 数组的典型读取访问将在 x86 平台上的编译代码中如下所示

// pa[i]
mov ecx, pa // read pointer value from memory
mov eax, i
mov <result>, dword ptr [ecx + eax * 4]

对 vector 元素的访问看起来几乎相同。

对作为数组对象可用的本地 int 数组的典型访问如下所示

// a[i]
mov eax, i
mov <result>, dword ptr [esp + <offset constant> + eax * 4]

对作为数组对象可用的全局 int 数组的典型访问如下所示

// a[i]
mov eax, i
mov <result>, dword ptr [<absolute address constant> + eax * 4]

性能差异源于第一个变体中额外的 mov 指令,它必须进行额外的内存访问。

但是,差异可以忽略不计。而且它很容易优化到在多访问上下文中完全相同(通过将目标地址加载到寄存器中)。

因此,当数组可以直接通过数组对象而不是指针对象访问时,关于“数组更快一点”的说法在狭义的情况下是正确的。但这种差异的实际值(value)几乎没有。

关于C++ STL : Array vs Vector: Raw element accessing performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740020/

相关文章:

c++ - 错误: expression cannot be used as a function?

c++ - 如何有效应对需要所有权的临时 helper ?

c++ - 让赋值运算符作用于声明

c++ - 需要在 Solaris 10 上为 GNU g++ 2.95.3 放置线程安全的 std::string

c++ - 对构造函数的调用可以被视为函数声明吗?

使用文件系统层次结构创建树的 Java 方法

java - Eclipse - Java 数组 ID 值相等。无法独立更改值

c++ - 通过HTML访问程序资源时如何获取可执行文件名?

c++ - STL独立初始化列表

带有应用的javascript数组映射