未知的编译器“优化”毫无意义

时间:2011-04-21 19:29:28

标签: visual-studio-2008 assembly x86 reverse-engineering compiler-optimization

我正在查看使用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内使用时,eaxcanParse都会被覆盖。

1 个答案:

答案 0 :(得分:0)

正如@Radek Pro-Grammer在他的评论中所建议的那样,即使有更多指令似乎无用,代码也可能在更少的时钟周期内运行。如今处理器要复杂得多,包括流水线,预取队列,缓存,超标量设计等,因此优化可能非常大胆。 :)