Visual studio 2008 未知编译器“;“优化”;毫无意义

Visual studio 2008 未知编译器“;“优化”;毫无意义,visual-studio-2008,assembly,x86,reverse-engineering,compiler-optimization,Visual Studio 2008,Assembly,X86,Reverse Engineering,Compiler Optimization,我在看我用VisualStudio2008编译的一些代码的反汇编,我看到一些奇怪的“优化”在代码中随处可见,当调用函数和传递参数时,这些都没有什么意义。例如,以下代码输出以下反汇编: 代码: 拆卸: 在这种情况下,push ecx在堆栈上留下一些空间,然后被[esp+50h+code]覆盖 编译器为什么这样做? 它不能节省空间。(使用mov-ecx[esp+50h+code];按ecx)据我所知,这并不能节省时间。(执行我刚才提到的两条指令不是更快吗?) 此外,正如@Radek programm

我在看我用VisualStudio2008编译的一些代码的反汇编,我看到一些奇怪的“优化”在代码中随处可见,当调用函数和传递参数时,这些都没有什么意义。例如,以下代码输出以下反汇编:

代码:

拆卸:

在这种情况下,
push ecx
在堆栈上留下一些空间,然后被
[esp+50h+code]
覆盖

编译器为什么这样做?

它不能节省空间。(使用
mov-ecx[esp+50h+code];按ecx
)据我所知,这并不能节省时间。(执行我刚才提到的两条指令不是更快吗?)


此外,正如@Radek programmer在其评论中所建议的那样,
ecx
eax
canParse
中使用时都会被覆盖,即使有更多看起来无用的指令,代码也可能以更少的时钟周期运行。现在的处理器更加复杂,有流水线、预取队列、缓存、超标量设计等,因此优化可能相当困难。。(注:)

也许是指令多了,时钟周期少了?@drhirsch:他是对的:
movecx,[esp+50h+code];mov-eax,esp;mov[eax],ecx
mov[esp],[esp+50h+code]
相同(我知道这是非法寻址模式),因此会覆盖上一次推送thing@BlackBear:类似“推送dword[esp+50h+代码]”的内容有效,可能会替换4条指令。我还想假设“乐观主义者不是完美的”比“更多的指令但更少的周期”更有可能。我们应该制定基准。这只是纳秒的问题,没什么特别的
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 *)