能力值:
( LV2,RANK:10 )
|
-
-
2 楼
这个很好理解吧。看这个例子。
#include <windows.h>
int func0() { return 1234; }
int func1() { return func0(); }
int func2() { int result; result = func0(); return result; }
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { func1(); func2(); return 0; }
汇编一下。
004017D0 /$ 55 push ebp ; WinMain 004017D1 |. 8BEC mov ebp, esp 004017D3 |. E8 E8FFFFFF call 004017C0 ; func1 004017D8 |. E8 C3FFFFFF call 004017A0 ; func2 004017DD |. 33C0 xor eax, eax 004017DF |. 5D pop ebp 004017E0 \. C2 1000 retn 10
004017C0 /$ 55 push ebp ; func1 004017C1 |. 8BEC mov ebp, esp 004017C3 |. E8 C8FFFFFF call 00401790 004017C8 |. 5D pop ebp 004017C9 \. C3 retn
004017A0 /$ 55 push ebp ; func2 004017A1 |. 8BEC mov ebp, esp 004017A3 |. 51 push ecx 004017A4 |. E8 E7FFFFFF call 00401790 004017A9 |. 8945 FC mov dword ptr [ebp-4], eax 004017AC |. 8B45 FC mov eax, dword ptr [ebp-4] 004017AF |. 8BE5 mov esp, ebp 004017B1 |. 5D pop ebp 004017B2 \. C3 retn
00401790 /$ 55 push ebp ; func0 00401791 |. 8BEC mov ebp, esp 00401793 |. B8 D2040000 mov eax, 4D2 00401798 |. 5D pop ebp 00401799 \. C3 retn
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
长见识了,谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
刚刚用vc对应的反汇编看了看。
16: result = func0();
004010B8 call @ILT+0(func0) (00401005)
004010BD mov dword ptr [ebp-4],eax
17: return result;
004010C0 mov eax,dword ptr [ebp-4]
明白了~thanks~
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
说得很好。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
用写汇编的思路来看就会无法理解了。可是这个。。。不会被优化掉么?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我用的VC2005 release编译,默认优化选项是Maximize Speed (/O2),这样确实会被优化掉。整个WinMain函数就2行
00401000 /$ 33C0 xor eax, eax 00401002 \. C2 1000 retn 10
为了做演示,就把优化选项改成 Disabled (/Od),就看到2楼的结果了。
|
能力值:
( LV7,RANK:100 )
|
-
-
8 楼
没有优化就这样……
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
类型强制转换。没有确实可以,但这与编译器有关(优化问题)!
|
|
|