能力值:
( LV3,RANK:20 )
|
-
-
2 楼
c是a,b的最大值,编译时知道是5.
printf("%d",c);
优化后直接输出5了。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
啊 编译器这么智能呀。
连函数干了什么也知道。
怎么让他不优化呀,我想看看 加inline跟不加inline是怎么处理的。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
用VS2008编译的居然和VS2010的不一样?
========================================================
004113DE C745 F8 0400000>MOV DWORD PTR SS:[EBP-8],4
004113E5 C745 EC 0500000>MOV DWORD PTR SS:[EBP-14],5
004113EC C745 E0 0000000>MOV DWORD PTR SS:[EBP-20],0
004113F3 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
004113F6 50 PUSH EAX ; push 5
004113F7 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
004113FA 51 PUSH ECX ; push 4
004113FB E8 18FDFFFF CALL test_inl.00411118 ;max函数
00411400 83C4 08 ADD ESP,8
00411403 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX
00411406 8BF4 MOV ESI,ESP
00411408 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20]
0041140B 50 PUSH EAX
0041140C 68 3C574100 PUSH test_inl.0041573C ; ASCII "%d"
00411411 FF15 BC824100 CALL DWORD PTR DS:[<&MSVCR90D.printf>] ; MSVCR90D.printf
00411417 83C4 08 ADD ESP,8
0041141A 3BF4 CMP ESI,ESP
0041141C E8 29FDFFFF CALL test_inl.0041114A
00411421 8BF4 MOV ESI,ESP
00411423 FF15 C4824100 CALL DWORD PTR DS:[<&MSVCR90D.getchar>] ;
========================================================
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。
刚才又查了下:在程序中,调用内联函数时,该函数在编译时被替代,而不是像一般函数那样是在运行时被调用。所以没有出现那种
push 5
push 4
call max
那个push 5,应该是printf()函数中对C压栈。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=李小龙lxl;948485]用VS2008编译的居然和VS2010的不一样?
========================================================
004113DE C745 F8 0400000>MOV DWORD PTR SS:[EBP-8],4
004113E5 C...[/QUOTE]
2010果然比较厉害呀。
可能效率高了些。
5# kongfei
那个我设不设置内联,好像都没什么关系。
vs2010 都没有调用函数call,直接将结果push出来了。
看4l那个od源码才确定
|
|
|