Время доступа к элементу в типичной реализации 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
в первом варианте, который должен сделать дополнительный доступ к памяти.
Однако разница незначительна. И он легко оптимизируется до такой же степени, что и в контексте множественного доступа (путем загрузки целевого адреса в регистр).
Таким образом, утверждение о том, что «массивы работают немного быстрее», является правильным в узком случае, когда массив доступен непосредственно через объект массива, а не через объект указателя. Но практическая ценность этой разницы практически ничто.
Посмотрите на режим без вилки :
Обычно проверяйте вилки, чтобы создать отдельное адресное пространство. Это позволяет поймать сигнал или ранний выход и сообщить о нем, а не останавливать всю программу тестирования, и обычно очень полезно. Однако, когда вы пытаетесь отладить, почему произошла ошибка сегментации или другая ошибка программы, разветвление затрудняет использование инструментов отладки.
Попробуйте TAP (Test Anything Protocol)… его намного проще реализовать, отправить и отладить. Также очень легко сделать его осведомленным о valgrind
и, как правило, лучше работает с gdb
.