我正在查看使用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
都会被覆盖。
答案 0 :(得分:0)
正如@Radek Pro-Grammer在他的评论中所建议的那样,即使有更多指令似乎无用,代码也可能在更少的时钟周期内运行。如今处理器要复杂得多,包括流水线,预取队列,缓存,超标量设计等,因此优化可能非常大胆。 :)