Я смотрел на дизассемблирование некоторого кода, скомпилированного с Visual Studio 2008, и вижу странный мусор "оптимизации" в коде, который не совсем понятен при вызове функций и передаче параметров. Например, следующий код выводит следующую разборку:
Код:
int version;
int result = canParse(code, &version);`
Демонтажные:
003CE9FA push eax ; version
003CE9FB push ecx ; code
003CE9FC mov ecx, [esp+50h+code] ; AbcParser *
003CEA00 mov eax, esp
003CEA02 mov [eax], ecx
003CEA04 call avmplus::AbcParser::canParse(avmplus::ScriptBuffer,int *)
В этом случае push ecx
освобождает место в стеке, которое затем перезаписывается на [esp+50h+code]
.
Почему компилятор делает это?
Это не экономит место. (mov ecx, [esp+50h+code]; push ecx
потребовалось бы меньше места.) Насколько я знаю, это не экономит время. (Не будет ли выполнение двух только что упомянутых мной инструкций быстрее?)
Кроме того, ecx
и eax
перезаписываются при использовании в canParse
.