アセンブリから見たc++におけるexternキーワードの使用
1602 ワード
c++では、externキーワードは変数と関数を宣言するために使用されます.関数を宣言する場合、externがない場合と同じ効果があります.つまり、次の2つの文は同じ効果を有します.
しかし、変数については、externがあるかないかで違いがあり、externがある場合は、コンパイラにこの変数があることを知らせるだけで、コンパイラはその変数に記憶空間、すなわち本当の宣言を割り当てない.externがない場合、コンパイラは宣言と同時にその変数にストレージスペースを割り当てます.
次にexternがある場合のc++ソースコードを示します.
次に、対応する符号化を示します.
上記の符号化から、変数iに対して局上に記憶空間が割り当てられていないことがわかる
次はexternがない場合のc++ソースコードです.
次に、対応する符号化を示します.
externキーワードがない場合、変数iにスタックに記憶領域が割り当てられていることがわかります.
上記のアセンブリはcl命令を用いてコマンドラインで生成され、vs 2010で生成されると、アセンブリ符号化は異なるかもしれないが、意味は同じである.
extern void fun();
void fun();
しかし、変数については、externがあるかないかで違いがあり、externがある場合は、コンパイラにこの変数があることを知らせるだけで、コンパイラはその変数に記憶空間、すなわち本当の宣言を割り当てない.externがない場合、コンパイラは宣言と同時にその変数にストレージスペースを割り当てます.
次にexternがある場合のc++ソースコードを示します.
int main() {
extern int i;
}
次に、対応する符号化を示します.
; 1 : int main() {
push ebp
mov ebp, esp;esp , ebp , main ,
; ( ), ebp ,
; 2 : extern int i;
; 3 : }
xor eax, eax
pop ebp
ret 0; ,
上記の符号化から、変数iに対して局上に記憶空間が割り当てられていないことがわかる
次はexternがない場合のc++ソースコードです.
int main() {
int i;
}
次に、対応する符号化を示します.
; 1 : int main() {
push ebp
mov ebp, esp
push ecx; extern
;ecx , ecx , i
; ecx , , ,
; 2 : int i;
; 3 : }
xor eax, eax
mov esp, ebp
pop ebp
ret 0
externキーワードがない場合、変数iにスタックに記憶領域が割り当てられていることがわかります.
上記のアセンブリはcl命令を用いてコマンドラインで生成され、vs 2010で生成されると、アセンブリ符号化は異なるかもしれないが、意味は同じである.