栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

从汇编看c++中变量类型的深入分析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从汇编看c++中变量类型的深入分析

全局变量的生命期和可见性是整个程序的运行期间,下面就来用汇编来看一下实际情况:

c++源码:
复制代码 代码如下:
int i = 2;//全局变量

int main() {
    int j = i;
}

下面是汇编代码:
复制代码 代码如下:
PUBLIC    ?i@@3HA                        ; i
_DATA    SEGMENT
?i@@3HA    DD    02H                    ; 全局变量i内存空间
_DATA    ENDS
PUBLIC    _main
; Function compile flags: /Odtp
; File c:usersadministratordesktopc++testa.cpp
_TEXT    SEGMENT
_j$ = -4                        ; size = 4
_main    PROC

; 3    : int main() {

    push    ebp
    mov    ebp, esp
    push    ecx;为局部变量分配4字节存储区

; 4    :     int j = i;

    mov    eax, DWORD PTR ?i@@3HA            ; 获取全局变量i的的值
    mov    DWORD PTR _j$[ebp], eax;eax存有i的值,将它赋给局部变量j

; 5    : }

    xor    eax, eax
    mov    esp, ebp;//栈顶指针恢复,释放为j分配的栈空间
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS

从汇编语言中可以看到,全局变量i的内存分配在内存中的数据区(由_DATA指定),因此在程序运行的过程中始终存在,所以对于程序中的所有部分都可以访问,而且随着程序的结束销毁;而局部变量j的内存是在运行main函数中在栈上动态分配,而且main函数结束后,此空间被释放,因此在main函数外面不能访问局部变量j。

实际上,在操作系统载入可执行文件的时候,它首先将数据区中的数据载入相应的内存,然后才开始运行程序,因此,全局变量产生在文件加载之后,第一条程序语言执行之前。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/66689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号