Отладка модульного теста в C, использующем проверку

Время доступа к элементу в типичной реализации 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 в первом варианте, который должен сделать дополнительный доступ к памяти.

Однако разница незначительна. И он легко оптимизируется до такой же степени, что и в контексте множественного доступа (путем загрузки целевого адреса в регистр).

Таким образом, утверждение о том, что «массивы работают немного быстрее», является правильным в узком случае, когда массив доступен непосредственно через объект массива, а не через объект указателя. Но практическая ценность этой разницы практически ничто.

7
задан sth 13 April 2014 в 12:59
поделиться

2 ответа

Посмотрите на режим без вилки :

Обычно проверяйте вилки, чтобы создать отдельное адресное пространство. Это позволяет поймать сигнал или ранний выход и сообщить о нем, а не останавливать всю программу тестирования, и обычно очень полезно. Однако, когда вы пытаетесь отладить, почему произошла ошибка сегментации или другая ошибка программы, разветвление затрудняет использование инструментов отладки.

11
ответ дан 6 December 2019 в 12:52
поделиться

Попробуйте TAP (Test Anything Protocol)… его намного проще реализовать, отправить и отладить. Также очень легко сделать его осведомленным о valgrind и, как правило, лучше работает с gdb .

0
ответ дан 6 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: