sizeof函数与表达式操作无关
?
?
?
?
引子:
在32位操作系统中,如下程序输出结果?
?
0040104A ? call ? ? ? ?printf (00401080)
0040104F ? add ? ? ? ? esp,0Ch
9: ? ? ? ?return 0;
00401052 ? xor ? ? ? ? eax,eax
10: ? }
00401054 ? pop ? ? ? ? edi
00401055 ? pop ? ? ? ? esi
00401056 ? pop ? ? ? ? ebx
00401057 ? add ? ? ? ? esp,48h
0040105A ? cmp ? ? ? ? ebp,esp
0040105C ? call ? ? ? ?__chkesp (00401100)
00401061 ? mov ? ? ? ? esp,ebp
00401063 ? pop ? ? ? ? ebp
00401064 ? ret
?
?
?
指点:
从如下汇编代码可以看出,j = sizeof(++i+ ++i);这条语句的汇编代码仅仅只有一条,即将4赋值给j变量,可见sizeof()内的表达式操作++i+ ++i并未执行。
7: ? ? ? ?j = sizeof(++i+ ++i);
00401036 ? mov ? ? ? ? dword ptr [ebp-8],4
?
?
解惑:
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如:
sizeof( 2 ); // 2的类型为int,所以等价于 sizeof( int );
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于 sizeof( double );
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
【摘自:百度百科 词条sizeof】
网址:http://baike.baidu.com/view/1078660.htm
?
?