Время доступа к элементу в типичной реализации 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
Например, типичный доступ для чтения к массиву int
, доступный через значение указателя времени выполнения, будет выглядеть следующим образом в скомпилированном коде на платформе x86
// 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
в первом варианте, которая должна обеспечить дополнительный доступ к памяти.
Однако разница незначительна. И он легко оптимизируется до такой же степени, что и в контексте множественного доступа (путем загрузки целевого адреса в регистр).
Таким образом, утверждение о том, что «массивы работают немного быстрее», является правильным в узком случае, когда массив доступен непосредственно через объект массива, а не через объект указателя. Но практическая ценность этой разницы практически ничто.