c++の関数のstaticキーワードの使用説明をアセンブリから見る
1362 ワード
次にアセンブリ言語からその原理を見る.
次はc++ソースコードです.
以下はmain対応の符号化
次はadd関数に対応する符号化です.
main関数にしてもadd関数にしても、iにストレージスペースを割り当てることは見えません.つまり、iは呼び出しスタックにありません.
次の送金コードを見てください.
この文は、iに予め記憶空間を割り当て、上記の2つの関数が符号化された外部定義である.したがって,関数にstaticキーワードで修飾する変数のライフサイクルはプログラム全体に存在するが,可視性はadd関数のみであり,外ではアクセスできない.
次は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関数のみであり,外ではアクセスできない.