static CMyString test;
无论是静态局部变量还是静态全局变量都可以被多次赋值 但只会被定义一次
静态全局变量与静态局部变量的区别是他们的可活动期是不同的 意思就是作用域不同 但是他们的存在时间上是相同的 他们都是静态存储方式
有了以上的理论支持就比较容易理解其汇编代码了
Void main()
{
static CMyString test;
}
11: static CMyString test; ;清空寄存器缓存 0040111D xor eax,eax ;用来标记是否已定义 0040111F mov al,[`main'::`2'::$S1 (00437088)] ;一下三句如果al有值则跳过对象定义的代码 00401124 and eax,1 00401127 test eax,eax 00401129 jne main+61h (00401151) ;对标记为开始赋值 然后定义对象 0040112B mov cl,byte ptr [`main'::`2'::$S1 (00437088)] 00401131 or cl,1 00401134 mov byte ptr [`main'::`2'::$S1 (00437088)],cl 0040113A mov ecx,offset ___mbcodepage+8 (00437070) 0040113F call @ILT+45(CMyString::CMyString) (00401032) 00401144 push offset $E2 (004170a0) 00401149 call atexit (00401250) 0040114E add esp,4 00401151 …… |
总结
静态变量的定义可以归纳为如下 判断该变量对应标记位是否有值 –>有(已定义)à开始其他代码 没有值à为标记位赋值à定义变量 |