Я немного удивлен, что ptr быстрее, чем обсуждение массива, где доказательства того, что это не так, изначально даются кодом asm из Abhijith.
mov eax, dord ptr _a; // загрузить непосредственно значение из адреса _a
против
mov eax, dword ptr _p; // загрузка адреса / значения p в eax
и
mov ecx, dword ptr [eax]; // использовать загруженный адрес для доступа к значению и поместить в ecx
Массив представляет собой фиксированный адрес, поэтому процессор может напрямую обращаться к нему, но не так, как с ptr, для которого процессор должен получить доступ к значению!
Вторая партия кода не может быть скомбинирована, так как смещение массива должно быть рассчитано, чтобы сделать это для ptr, вам также потребуется как минимум еще 1/2 инструкции!
Все, что компилятор может вывести во время компиляции (фиксированные адреса, смещения и т. Д.), Является ключом к коду исполняемого кода.
Сравнение итеративного кода и присвоение переменным:
Массив:
; 2791: tmp = buf_ai [l];
mov eax, DWORD PTR _l$[ebp]
mov ecx, DWORD PTR _buf_ai$[ebp+eax*4]
mov DWORD PTR _tmp$[ebp], ecx
против
PTR
; 2796: tmp2 = * p;
mov eax, DWORD PTR _p$[ebp]
mov ecx, DWORD PTR [eax]
mov DWORD PTR _tmp2$[ebp], ecx
плюс
; 2801: ++ p;
mov eax, DWORD PTR _p$[ebp]
add eax, 4
mov DWORD PTR _p$[ebp], eax
Это просто для адреса загрузки ptr в первую очередь, чем использовать его по сравнению с массивом, используя адрес и получить значение одновременно!
С наилучшими пожеланиями