ホストマシン上で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を使用してチェックされています)。
0x613c20 = 0x0000000000613c20ので - それはどうやら、コンパイラやランタイムがちょうど下の4ギガバイトでヒープメモリを見つけるために起こった – Anty
先行ゼロを切り捨て64ビットアドレス空間の –
@Anty:その理由は、おそらく '0x02000000'は' 0x0000000002000000'が '0x0000000020000000'でないことを見るよりも' 0x20000000'ではないことが分かりやすいためです。 –