从汇编看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:\users\administrator\desktop\c++\test\a.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。
实际上,在操作系统载入可执行文件的时候,它首先将数据区中的数据载入相应的内存,然后才开始运行程序,因此,全局变量产生在文件加载之后,第一条程序语言执行之前。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了