#delphi #pascal
Чем отличается function some(i:integer):integer; begin some:=i; end; от procedure some(i:integer;var j:integer); begin j:=i; end; Предположительно, ничем. Может, кто-то уже делал тесты, или просто знает?
Ответы
Ответ 1
_FSOME$$INTEGER: push ebp mov ebp, esp sub esp, 4 mov eax, dword [ebp + 8] mov dword [ebp - 4], eax L1: mov eax, dword [ebp - 4] mov esp, ebp pop ebp ret 4 _PSOME$$INTEGER$INTEGER: push ebp mov ebp, esp mov eax, dword [ebp + 12] mov edx, dword [ebp + 8] mov dword [eax], edx L2: mov esp, ebp pop ebp ret 8 _main: mov dword [_A], 5 push dword [_A] call _FSOME$$INTEGER mov dword [_B], eax push offset [_B] push dword [_A] call _PSOME$$INTEGER$INTEGER call exit Если посчитаете количество команд то увидите что при использовании функции выполняется на 2 команды больше, чем в процедурном варианте. Уверен что на других компиляторах, с различными настройками оптимизации можно увидеть совсем другой результат. А по делу используйте функции когда вам надо вернуть одно значение, а вариант с процедурой когда нужно вернуть несколько значений.Ответ 2
Разница запросто может быть. Вообще, всё зависит от компилятора. В общем случае первый вариант должен работать быстрее на основных процессорах, так как число на выходе из функции передаётся через регистр в виде значения. Во втором случае, вы имеете указатель на место в памяти, куда надо записать результат. В втором случае у вас чтение параметра из стека (указатель j) и запись по этому адресу значения. В первом случае значение кладётся в eax/rax и функция заканчивается. Однако, есть вероятность, что компилятор "просечёт" ситуацию и во втором случае тоже попытается схитрить. Но это не обязательно произойдёт. К тому же, в общем случае это не всегда возможно.Ответ 3
Если посчитаете количество команд то увидите что при использовании функции выполняется на 2 команды больше, чем в процедурном варианте. Одинаковые инструкции в разной последовательности исполняются за разное время. Уже давно процессоры используют очереди команд(конвеер), предсказание ветвлений и пр. На этой конструкции: mov eax, dword [ebp + 8] mov dword [ebp - 4], eax Процессор будет простаивать. Вобщем отвратительный генерируемый код.
Комментариев нет:
Отправить комментарий