Я создал образец программы на C++ на 64-битной Linux-машине, работающей на VMware Player поверх хост-машины, в виде окон. Ниже приведен код класса.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 - это обрезает ведущие нули – Anty
Очевидно, что компилятор или среда выполнения только что произошло, чтобы найти память кучи в нижней 4Гб 64-разрядного адресного пространства. –
@Anty: И причина, по которой это происходит, по-видимому, потому, что намного проще видеть, что '0x02000000' не' 0x20000000', чем это означает, что '0x0000000002000000' не' 0x0000000020000000'. –