从汇编看c++中变量类型的深入分析
2018-10-12 14:09
507 查看
全局变量的生命期和可见性是整个程序的运行期间,下面就来用汇编来看一下实际情况:
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。
实际上,在操作系统载入可执行文件的时候,它首先将数据区中的数据载入相应的内存,然后才开始运行程序,因此,全局变量产生在文件加载之后,第一条程序语言执行之前。
您可能感兴趣的文章:
相关文章推荐
- C语言变量类型的深入分析
- C++ 变量和基本类型分析
- 用C++实现strcpy(),返回一个char*类型的深入分析
- C# 与 C++强强联合 ,深入C#内存管理来分析 值类型、引用类型、装箱、拆箱、堆栈几个概念组合
- c/c++字符指针与字符数组变量汇编层面的分析
- 从汇编看c++中的变量类型
- C++ 标准库迭代循环变量类型
- C++学习,变量和基本类型
- 深入分析C++中char * 和char []的区别
- C++--深入分析MFC文档视图结构(项目实践)
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- C++类型转化分析:静态转换->static_cast
- C++(8):指向不同类型变量或函数的pointer
- C++拷贝构造函数深入分析以及重写operator =
- C++多态汇编分析
- 深入分析C++中char * 和char []的区别
- 解析VC中创建DLL,导出全局变量,函数和类的深入分析
- 从汇编看c++中指向成员变量的指针(一)
- 深入C#内存管理来分析 值类型、引用类型、装箱、拆箱、堆栈几个概念组合
- C++类型转化分析