在一个典型的实现中,使用
std::vector
访问元素的时间与使用指向对象的普通数组(即运行时指针值)访问元素的时间相同。
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
例如,在x86平台上,通过运行时指针值访问的
int
数组的典型读取访问将在编译后的代码中如下所示。
// pa[i]
mov ecx, pa // read pointer value from memory
mov eax, i
mov <result>, dword ptr [ecx + eax * 4]
访问向量元素的方式基本相同。
对于作为数组对象可用的本地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
指令,这需要额外访问内存。
然而,差异微不足道,并且可以轻松优化到在多次访问的情况下完全相同(通过将目标地址加载到寄存器中)。
因此,“数组稍微快一点”这个说法在狭义情况下是正确的,当数组直接通过数组对象访问而不是通过指针对象访问时。但这种差异的实际价值几乎为零。