c++の関数のstaticキーワードの使用説明をアセンブリから見る

1362 ワード

次にアセンブリ言語からその原理を見る.
次は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;
    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に予め記憶空間を割り当て、上記の2つの関数が符号化された外部定義である.したがって,関数にstaticキーワードで修飾する変数のライフサイクルはプログラム全体に存在するが,可視性はadd関数のみであり,外ではアクセスできない.