- 论坛徽章:
- 0
|
回复 7# OwnWaterloo
果然如我所料,如果没有O1这个编译选项,VC++2010是不会压缩空间的。
如果加了O1这个"mini space"优化选项,出来的结果也不是OwnWaterloo提到的,临时变量都没有了,优化得很彻底。
我用的是VC2010,过早的优化果然罪恶!(开个玩笑)
无论如何,还是要谢谢OwnWaterloo的说法:勿以汇编释语言。
其实我也同意这个看法,所以尽量以K&R来作为解读文本。
但是对于一些实现相关的内容,如果还有通过自身的解释或者对标准的注解来做说明,那是非常费劲的。
《狂人C》中对++前后缀方式的说明就是如此,尽管键盘农夫试图把++解释的更为通俗易懂深入浅出,但是我看了还是一头雾水。
而当我看过++代码生成的“无优化VC++2010特别为了注释”版本以后,就恍然大悟,源码之下别无秘密。
而且,如果没有我用汇编展示的这个例子,OwnWaterloo大侠也不会出手解释,从这点来讲,也是抛砖引玉。
当然也可以说我这是一种误读,太细化,系统及平台依赖太强,
但是我感觉用汇编来解读部分C语言实现相关的细节,在现阶段对我而言是有帮助的,那就可以了。
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
do
{
char buf[1024];
buf[0] = 1;
}while (0);
a = 3;
do
{
char buf[1024];
buf[0] = 93;
}while(0);
return 0;
}
ASM输出结果为:
_TEXT SEGMENT
_buf$4413 = -2076 ; size = 1024
_buf$4409 = -1044 ; size = 1024
_a$ = -12 ; size = 4
__$ArrayPad$ = -4 ; size = 4
_argc$ = 8 ; size = 4
_argv$ = 12 ; size = 4
_wmain PROC ; COMDAT
; 7 : {
push ebp
mov ebp, esp
sub esp, 2272 ; 000008e0H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-2272]
mov ecx, 568 ; 00000238H
mov eax, -858993460 ; ccccccccH
rep stosd
mov eax, DWORD PTR ___security_cookie
xor eax, ebp
mov DWORD PTR __$ArrayPad$[ebp], eax
; 8 : int a = 0;
mov DWORD PTR _a$[ebp], 0
$LN6@wmain:
; 9 :
; 10 : do
; 11 : {
; 12 : char buf[1024];
; 13 : buf[0] = 1;
mov BYTE PTR _buf$4409[ebp], 1
; 14 : }while (0);
xor eax, eax
jne SHORT $LN6@wmain
; 15 :
; 16 : a = 3;
mov DWORD PTR _a$[ebp], 3
$LN3@wmain:
; 17 :
; 18 : do
; 19 : {
; 20 : char buf[1024];
; 21 : buf[0] = 93;
mov BYTE PTR _buf$4413[ebp], 93 ; 0000005dH
; 22 : }while(0); |
|