2017-01-23 18 views
0

ホストマシン上でVMware Player上で動作する64ビットLinuxマシン上のサンプルC++プログラムをウィンドウとして作成しました。以下はクラスコードです。C++ 64ビットマシン、32ビットのヒープアドレスを示します

 class operatorOverloadingTest{ 
      private: 
        int age; 
        char *name; 
      public: 
        operatorOverloadingTest(int age){ 
          this->age = age; 
          name = new char[10]; 
          strncpy(name,"Indra",strlen("Indra")); 
        } 

        void displayDetails(){ 
          cout<<"My Name :"<<name<<endl; 
          cout <<"My age: "<<age<<endl; 
        } 
        friend ostream & operator<<(ostream &out, const operatorOverloadingTest &myObj); 
        ~operatorOverloadingTest(){ 
          delete name; 
          cout<<" \nDestructor getting called"<<endl; 
        } 
    }; 

In my Main function, created object of class: 
1. By using new operator. 
2. Stack Object. 

int main(){ 
    operatorOverloadingTest *oOT = new operatorOverloadingTest(10); 
    operatorOverloadingTest oOT1(30); 

私は、64ビットマシンでは、メモリアドレスが8バイトで表されることを理解しています。私はGDBを使用してプログラムを実行すると

は、私は以下のアドレスを参照してください。

p oOT 
$1 = (operatorOverloadingTest *) 0x613c20 
p &oOT 
$2 = (operatorOverloadingTest **) 0x7fffffffe228 
&(oOT1.age) 
$7 = (int *) 0x7fffffffe210 
(gdb) p &(oOT->age) 
$8 = (int *) 0x613c20 

私の質問です、なぜヒープに割り当てられたオブジェクトは、32ビットのアドレス表現とスタック(oOT1)番組上のオブジェクトを示してい私のオペレーティングシステムは64ビットですが、64ビットのアドレス表現ですか? (uname -aを使用してチェックされています)。

+1

0x613c20 = 0x0000000000613c20ので - それはどうやら、コンパイラやランタイムがちょうど下の4ギガバイトでヒープメモリを見つけるために起こった – Anty

+0

先行ゼロを切り捨て64ビットアドレス空間の –

+0

@Anty:その理由は、おそらく '0x02000000'は' 0x0000000002000000'が '0x0000000020000000'でないことを見るよりも' 0x20000000'ではないことが分かりやすいためです。 –

答えて

1

オブジェクトはヒープに割り当てられない理由私の質問は、であるあなたが0x1234を見てみると、あなたが知っている32ビットのアドレス表現とスタック上のオブジェクト(oOT1)は64ビットのアドレス表現

をそれぞれ示しますエンティティはで少なくともの16ビットですが、16ビット、32ビット、または64ビットエンティティのいずれにも指定できません。これは、GDBは先行ゼロを出力しないためです。

あなたには、いくつかのプログラムの実体がいかに大きいかを知りたい場合は、試してみてください。

(gdb) print sizeof(oOT) 
(gdb) print sizeof(&ooT) 
+0

GDBは先行ゼロを出力しません。 RAMにロードされているバイナリのメモリマップをチェックするコマンドはありますか?このようにして、ヒープセグメントの開始アドレスと終了アドレスを確認し、ゼロを先行していることを確認できます。 sizeof()はオブジェクトが必要とするメモリを示しています。オブジェクトのアドレス指定に使用されているシステムのメモリ表現を知りたかった –

+1

@IndraChatterjeeおそらく '(gdb)info proc map' –

関連する問題