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

2016-02-19 09:18 6 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的从汇编看c++中变量类型的深入分析,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

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

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。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1590315.html

延伸阅读
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者的分析情况一样(对于默认的构造函数分析,请参看《从汇编看c++中默认构造函数的使用分析》)。并且编译器会提供非无用的默认析构...
在编写代码做测试时发现两个大数相乘结果不正确的问题,测试代码如下: #include "stdafx.h" #includestdlib.h #includetime.h int _tmain(int argc, _TCHAR* argv[]) {      time_t temp1=1345172428000000;     time_t temp2=1345172428*1000000;    ::system("pause");     r...
下面从汇编语言看其原理. 下面是c++源代码: 代码如下: void add() {     static int i = 1;     i++; } int main() {    add(); } 下面是main对应的汇编码 代码如下: ; 5    : int main() {     push    ebp     mov &...
深入分析MFC中的CArray类 作者:湖北 董志勇 我们在使用vc进行比较复杂的编程时,经常需要用到复杂的数组结构,并希望能实现动态管理。由于C++并不支持动态数组,MFC提供了一个CArray类来实现动态数组的功能。有效的使用CArray类,可以提高程序的效率。 MFC提供了一套模板库,来实现一些比较常见的数据结构如Ar...
一.创建DLL 1.在VC中新建一个Win32空项目MathLib; 2.添加预编译头文件stdafx.h,定义导入导出控制符号: 代码如下: //stdafx.h #pragma once #define MATHLIB_EXPORT 3.添加包含要导出的全局变量,函数和类的头文件MathLib.h: 代码如下:  //MathLib.h  #pragma once  #ifdef MATHLIB_EXPORT  #define MATHLIBAPI __...

经验教程

177

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部