2012-03-13 8 views
-3

私は1点の明確化、に関するC++のポインタと物理メモリ

class Foo 
{ 

} 

main() 
{ 
    Foo obj; //1 
    method(obj); 
    method1(&obj); 

    Foo* obj1; 
    method2(&obj1); //4 

} 

void method(Foo objfoo) //2 
{ 

} 

void method1(Foo* objfoo) //3 
{ 

} 

void method2(Foo* & objfoo){} 

Q1を持っています。メインスタックフレーム内にオブジェクトを割り当てますか?

Q2。メソッドスタックフレーム内にFooのコピーをもう1つ作成しますか?

Q3。 mainメソッドに存在するobjに同じオブジェクトが存在することを指摘しますか?

Q4。これは何を意味しますか?説明が必要ですか?

+0

@Ademiban、この質問を閉じる理由が必要です。私は初心者からC++にいたるまで、C++オブジェクトのメモリモデルをよりよく理解するために、上記の質問にいくつかの確認が必要です。 – Muthu

+0

すべてのボディにはそれぞれ独自の説明があります。特定の形式の質問を期待するのは間違いです。 – Muthu

+0

コードを書くときは、コードをうまく印刷するために "{}"アイコンを使います(最初に選択する必要があります)。 –

答えて

1

これらはQ1、Q2、などではなく、彼らが問題に現れる順序で並べられなければなりません。

  1. はい。 (少なくとも、スタックフレームまたはスタックが存在する限り)。
  2. はい、少なくとも理論的には(実際には、コンパイラによってコピーが削除される可能性があります)。
  3. はい、method1は、既存のオブジェクトへのポインタを受け取ります。
  4. obj1のアドレスをmethod2に渡しています。

その他:Q4で述べたmethod2の呼び出しは実際には機能しません。 obj1Fooへのポインタとして定義されており、method2はFooへのポインタへの参照をとります。ではありません。は、呼び出しを行うためにポイントのアドレスを明示的に取得する必要があります。そうすることで、ポインターへのポインターが作成されます。method2には、ポインターへの参照が必要です。 method2(obj1);を使用すると、少なくとも構文的には正しくなりますが(実際に正しく動作するかどうかは疑問があります)

+0

基本的な質問が1つあります...スタックフレームを作成し、関数バイナリをテキスト領域からスタックフレームにロードするのは誰ですか?それはいつ起こるのだろうか? – Muthu

+0

@Muthu:スタックフレームを構築/破壊するコードは通常、コードにコンパイルされます(例えば、関数は 'push bp/mov bp、sp/sub sp、frame_size'のようなもので始まり、' pop bp/ret')。ローカル変数を初期化する場合も同様に、ctor呼び出し(たとえば)はバイナリにコンパイルされます。 –

0

Q1:はい。

質問4:&は "のアドレス"を意味します。ポインタのアドレスを取ると、Foo**のポインタへのポインタが得られます。

質問2:はい。

質問3:はい。

method2:無効、それは

void method2(Foo** obj); 
+0

私は基本的な質問が1つあります。スタックフレームを作成し、関数バイナリをテキスト領域からスタックフレームにロードするのは誰ですか?それはいつ起こるのだろうか? – Muthu

+0

OSとコンパイラがこれをやっています。プロセスが開始される前に、すべてのコードがロードされます。スタックは、関数が呼び出されたとき、つまり関数を呼び出す行と関数の最初の行の間に変更されます。あなたはそれについて心配する必要はありません。 –

関連する問題