关闭

从汇编看c++中的static关键字

发表于:2013-5-17 13:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:chaoguo1234    来源:51Testing软件测试网采编

  c++中的static关键字可以修饰全局变量,局部变量和类成员数据(当然还有类的成员函数,但是这里只讨论static修饰变量的情况)。对于static修饰全局变量的情况,和单纯的全局变量类似,生命期存在于整个程序执行期间,在程序加载后,第一条程序语句执行之前就已存在,只是编译器限制它只有文件作用域(即只能在本文件访问)。因此,static修饰的全局变量等价于只有文件作用域的全局变量。

  对于static修饰的局部变量有点特殊,该变量的可见性(也就是作用域)任是函数里面,但是生命期确实整个程序运行期间,下面来看一看实际情形:

  c++源码:

void add(int i) {
    static int sum = 0;
    sum += i;
}

int main() {
    add(5);
}

  对应的汇编码:

_BSS    SEGMENT
?sum@?1??add@@YAXH@Z@4HA DD 01H DUP (?)            ; sum的内存空间
; Function compile flags: /Odtp
_BSS    ENDS
_TEXT    SEGMENT
_i$ = 8                            ; size = 4
?add@@YAXH@Z PROC                    ; add

; 1    : void add(int i) {

    push    ebp
    mov    ebp, esp

; 2    :     static int sum = 0;
; 3    :     sum += i;

    mov    eax, DWORD PTR ?sum@?1??add@@YAXH@Z@4HA;取sum的值放入寄存器eax
    add    eax, DWORD PTR _i$[ebp];取参数i的值,与eax中的值相加
    mov    DWORD PTR ?sum@?1??add@@YAXH@Z@4HA, eax;将相加的结果放入sum对应的存储空间

; 4    : }

    pop    ebp
    ret    0
?add@@YAXH@Z ENDP                    ; add
_TEXT    ENDS
PUBLIC    _main
; Function compile flags: /Odtp
_TEXT    SEGMENT
_main    PROC

; 6    : int main() {

    push    ebp
    mov    ebp, esp

; 7    :     add(5);

    push    5;将参数5压栈
    call    ?add@@YAXH@Z                ; 调用add函数
    add    esp, 4

; 8    : }

    xor    eax, eax
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号