5

タイプ、サイズなどの変数に関する情報を格納するためにCランタイムが使用するデータ構造は何ですか

元:

void foo(){
  int bar=0, goo=44;
  int*q, *p = &goo;
  //some code follows

  bar = goo + bar*9; 
  ...
  q=p;
  ... 
}

上記のコードには、制御が foo 関数に到達したときにスタックに割り当てられるローカル変数 bar と goo があります。しかし、後でこれらの変数が参照されたときに、これらの変数がまあまあの型であり、まあまあのサイズであると、ランタイムはどのように判断するのでしょうか?

4

4 に答える 4

3

ランタイムはそのような情報を保持しません。コンパイラが定数として生成するバイナリ コードにコンパイルされます。コンパイラは各型のサイズを認識しているため、スタックのクリーンアップ、配列要素へのアクセス、構造体のフィールドへのアクセスなどのための適切なマシン コードを生成する方法を認識しています。バイナリコードには適切な命令がすべて含まれているため、実行時にこの情報を保持する必要はありません。

于 2012-05-25T16:04:17.117 に答える
3

変数のサイズはコンパイル時に認識されるため、実行時に保持する必要はありません。

int bar = 0;

単に翻訳すると

"shift the stack pointer by 4 bytes"

実行時に変数の型を知る必要はまったくありません。intで印刷するなど、互換性のない型に関するコンパイラの警告が表示される場合があります%cが、これはより健全なチェックです。変数は単にデータのチャンクに名前を付けるだけで、それらをどのように解釈するかはあなた次第です-整数として、ポインターとして、4文字として...

于 2012-05-25T16:07:15.180 に答える
3

通常、これはコンパイル時に基盤となるマシン コードにハード コードされており、実行時に保持されるデータはありません。

例として、変数 bar がスタックに配置されているとします。コンパイラはスタック上のどこに配置されたかを記憶し、その後の bar へのすべての参照は、関連するスタック オフセットで変数のサイズを取得するマシン コードになります。同じことがプロセッサレジスタに保持されている変数にも当てはまり、それらへの参照は、適切なレジスタとバイト長にアクセスするマシンコードに変換されます。

于 2012-05-25T16:07:42.547 に答える
0

コンパイラは、構成されたプラットフォームのこの情報を認識しています。コンパイラには、さまざまなデータ型のサイズを伝える C インクルード ヘッダー ファイルもあります。これを見る

于 2012-05-25T16:11:44.060 に答える