アセンブリから見たc++におけるexternキーワードの使用

1602 ワード

c++では、externキーワードは変数と関数を宣言するために使用されます.関数を宣言する場合、externがない場合と同じ効果があります.つまり、次の2つの文は同じ効果を有します.
 
  
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で生成されると、アセンブリ符号化は異なるかもしれないが、意味は同じである.