Неизвестный компилятор "оптимизации" не имеет смысла - PullRequest
0 голосов
/ 21 апреля 2011

Я смотрел на дизассемблирование некоторого кода, скомпилированного с 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.

1 Ответ

0 голосов
/ 22 апреля 2011

Как предложил @Radek Pro-Grammer в своем комментарии, даже если есть больше инструкций, которые кажутся бесполезными, код может выполняться за меньшее количество тактов.В настоящее время процессоры намного сложнее, с конвейерной обработкой, очередью предварительной выборки, кэшированием, суперскалярным дизайном и т. Д., Поэтому оптимизация может быть довольно ... дерзкой.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...