zoukankan      html  css  js  c++  java
  • 从汇编看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。

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

  • 相关阅读:
    PHP常量
    jquery中的几种常用总结
    jquery中的ajax
    常用的jquery一些总结
    js验证手机号邮箱号用户名
    PHP优化杂烩
    一个php开发的用于路由器的小功能
    HTML <form>
    window.open
    try&catch
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/3073009.html
Copyright © 2011-2022 走看看