2017-04-26 7 views
3

私の不思議を定義するために、私はそれが一例と素晴らしいことだと思いますが:名前はどのように関連付けられたメモリアドレスで記憶されていますか?

  • 変数xが2の初期値を使用して宣言し、グローバルスコープを持っている

    int x = 2; 
    
  • ので、その変数xにはグローバルスコープがあり、どこでも見ることができます。つまり、コンパイラはメモリアドレスを何とか思い出す必要があります。とにかく、Xは、その後、「BLA」

    void bla() 
    { 
        x = 5; 
    } 
    
  • ので、コンパイラ(このすべてを扱うかわからないが)、「X」は、この名前を覚えているし、何とかに属しているメモリアドレスを知ることができると呼ばれる特定の機能から変更されました一緒に属し

    1. どのコンパイラ(これについてはまだわからないが)どのような名前/識別子とメモリアドレスを覚えていない:名X ...

だから私の質問はありますか?この情報はどこに保存されていますか?メモリアドレスとしても保存されていますか?

  • プログラマーが名前の代わりに実際のメモリアドレスを書いたほうが技術的に速いですから、コンパイラ(これらのものを扱うものがわからないことが分かっているでしょう)がすべての変数を置き換える必要はありません。アドレスは?
  • ありがとう!私は本当に何かをあいまいにしないようにしましたが、まだ混乱していると思われる場合は、コメントしてください。

    +5

    C++標準で定義されたメカニズムはありません。各コンパイラは必要な変数を自由に覚えています。一般的に、各ネストされたスコープと各シンボルの意味を追跡するために、ある種のマップリストを使用します。プログラマが生のメモリアドレスを書いたとしてもそれほど速くはありません。実際、人間はこの種の作業でコンパイラよりもずっと遅くなるでしょう。 – cdhowie

    +0

    これは、遭遇したすべての変数をある種の内部マップに埋め込むだけです。 – ForceBru

    +2

    最初に、デバッグのために人々が使用する以外は、出力オブジェクトファイルに変数名が存在しないことを理解してください。次に、リンカーが何をしているのかを理解する必要があります。それ以外の場合は、私には簡単で明白です。あなたが解決しようとしている特定の問題を説明することができれば、本当に役に立ちます。 – user34660

    答えて

    1

    言語とコンパイラの設計に関するいくつかの学習リソースを参照する必要があります。

    C++言語の定義には、宣言ポイントとスコープの概念があります。これらのことはコンパイラによって尊重される必要があります。したがって、整形式コード内のすべての式に対して、コンパイラはこの式がどのスコープに属しているか、スコープがネストされているかを知ります。

    典型的なコンパイラの実装にはデータ構造があり、各スコープはシンボルテーブルに関連付けられており、現在のスコープの宣言/定義済みシンボルがリストされています。今度は、コンパイラ(典型的な実装では完全に異なったことが可能です)がコード内のシンボル(例えばx = 5;のようなもの)を検出すると、シンボルxが現れるまで、現在のスコープとその親スコープのシンボルテーブルを調べます。まず見つかりました。シンボルの使用法は、シンボルテーブルの1つにあるシンボル定義とリンクされます。 x以来

    global scope 
        function bla scope 
        function bla body scope 
    

    ローカルインナースコープのいずれかに定義/宣言されていない、コンパイラはその定義に使用をリンクします:いくつかの詳細をスキップ

    、あなたの例では、少なくとも次のスコープのネストが含まれていますグローバルスコープ内にあります。

    技術的

    、コンパイラは(おそらく 私はこれらの事を扱うかについてわからないことを今では知っている)持って ないようにプログラマが実際 メモリアドレスの代わりに名前を書いた場合、それはより速くなりますすべての変数などをアドレスに置き換えますか?

    私たちが開発について話すとき、コンパイラはこのタスクのプログラマよりもはるかに高速なので、ここで時間を節約することはありません。プログラムの実行について

    、シンボルは、コンパイラがそのプログラムのローカルメモリアドレスによってそれを置き換えるされているので(デバッグ情報を除く)はもう存在しません。一般に、コンパイラによって行われる手作業で実行時間を節約することはできません。

    関連する問題