亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

從匯編看c++中函數里面的static關鍵字的使用說明

 更新時間:2013年05月06日 10:22:42   作者:  
c++中的static關鍵字使得函數里面的局部變量的存活期不在局限于函數里面,而是變?yōu)樵谡麄€程序生命期里面都有效

下面從匯編語言看其原理.

下面是c++源代碼:

復制代碼 代碼如下:

void add() {
    static int i = 1;
    i++;
}
int main() {
   add();

}

下面是main對應的匯編碼
復制代碼 代碼如下:

; 5    : int main() {

    push    ebp
    mov    ebp, esp

; 6    :    add();

    call    ?add@@YAXXZ                ; 調用add

; 7    :   
; 8    : }

    xor    eax, eax
    pop    ebp
    ret    0


下面是add函數對應的匯編碼:
復制代碼 代碼如下:

; 1    : void add() {

    push    ebp
    mov    ebp, esp

; 2    :     static int i = 1;
; 3    :     i++;

    mov    eax, DWORD PTR ?i@?1??add@@YAXXZ@4HA;取變量i的值
    add    eax, 1;執(zhí)行加法
    mov    DWORD PTR ?i@?1??add@@YAXXZ@4HA, eax;存變量i的值

; 4    : }

    pop    ebp
    ret    0


可以看,不論是main函數,還是add函數里面,我們都看不到為i分配存儲空間,也就是說,i不在他們的調用棧里面。

再看下面的匯編碼:

復制代碼 代碼如下:

_DATA    SEGMENT
?i@?1??add@@YAXXZ@4HA DD 01H                ; 為變量i聲明存儲空間
; Function compile flags: /Odtp
_DATA    ENDS

這條語句為i預先分配了存儲空間,并且在上面兩個函數匯編碼的外面定義。因此,函數里面由static關鍵字修飾的變量生命期存在于整個程序里面,但是,可見性依然只在add函數里面,在外面訪問不到.

相關文章

  • 淺析iterator與指針的區(qū)別

    淺析iterator與指針的區(qū)別

    指針和iterator都支持減法運算,指針-指針得到的是兩個指針之間的距離,迭代器-迭代器得到的是兩個迭代器之間的距離
    2013-10-10
  • C++設計模式中控制反轉與依賴注入淺析

    C++設計模式中控制反轉與依賴注入淺析

    這篇文章主要介紹了C++設計模式中控制反轉與依賴注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • C++ getline函數用法詳解

    C++ getline函數用法詳解

    這篇文章主要介紹了C++ getline函數用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • MFC自定義消息的實現方法

    MFC自定義消息的實現方法

    這篇文章主要介紹了MFC自定義消息的實現方法,通過該示例可以更好的理解MFC的消息封裝機制,以便更加靈活的打造個性化的windows應用程序,需要的朋友可以參考下
    2014-07-07
  • C語言實現學生宿舍管理系統(tǒng)

    C語言實現學生宿舍管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現學生宿舍管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺析C語言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別

    淺析C語言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別

    以下是對C語言中printf(),sprintf(),scanf(),sscanf()的用法以及區(qū)別進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 詳解C++編程中的vector類容器用法

    詳解C++編程中的vector類容器用法

    vector是一個標準庫中的容器,使用時需要包含#include <vector>頭文件,也可以說vector是一個類模板而不是一種數據類型,對它的定義,需要指定類型,需要的朋友可以參考下
    2016-05-05
  • C語言中#define在多行宏定義出錯的原因及分析

    C語言中#define在多行宏定義出錯的原因及分析

    這篇文章主要介紹了C語言中#define在多行宏定義出錯的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++?Boost?Format超詳細講解

    C++?Boost?Format超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++實現位圖排序實例

    C++實現位圖排序實例

    這篇文章主要介紹了C++實現位圖排序,是比較重要的排序算法,需要的朋友可以參考下
    2014-08-08

最新評論