2017-01-23 1 views
0

Я создал образец программы на 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).

+1

потому 0x613c20 = 0x0000000000613c20 - это обрезает ведущие нули – Anty

+0

Очевидно, что компилятор или среда выполнения только что произошло, чтобы найти память кучи в нижней 4Гб 64-разрядного адресного пространства. –

+0

@Anty: И причина, по которой это происходит, по-видимому, потому, что намного проще видеть, что '0x02000000' не' 0x20000000', чем это означает, что '0x0000000002000000' не' 0x0000000020000000'. –

ответ

1

Мой вопрос, почему объект выделяется в куче показывает 32 битный адрес представления а и объект на стеке (oOT1) показывает 64-битовый адрес представления а

Когда вы смотрите на 0x1234, вы знаете, что объект имеет не менее 16 бит, но вы не можете определить, является ли это 16-разрядным, 32-разрядным или 64-разрядным объектом, поскольку GDB не будет печатать ведущие нули.

Если вы хотите знать, насколько велика какая-то программа объект, попробуйте:

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

GDB не печатает ведущие ноль. Есть ли какая-либо команда для проверки карты памяти моего двоичного файла при ее загрузке в ОЗУ. Таким образом, я мог проверить начальный и конечный адрес сегмента кучи и подтвердить, что у них есть начальные нули. sizeof() показывает память, требуемую объектом, я хотел знать представление памяти в системе, используемой для адресации объекта –

+1

@IndraChatterjee Вы, вероятно, ищете '(gdb) info proc map' –

Смежные вопросы