Почему я вижу указатели c ++ в многотерабайтном диапазоне на компьютере Mac с 16 гигабайтами памяти? - PullRequest
0 голосов
/ 19 июня 2019

Значения адресов памяти, выводимые компилятором C ++ 14 на Mac Mini с 16 ГБ оперативной памяти (+1 ГБ виртуальной), показывают лишь незначительный диапазон 128 ТБ, даже если разница между стеком и кучей превышает 186 ГБ.

Я только что установил последний компилятор C ++ (чтобы обновить свои знания C ++) на моем Mac Mini с процессором Intel, 16 ГБ ОЗУ, 1 ТБ SSD.

#include <iostream>

int main () {
    double value = 2.0;
    double* pvalue  = NULL; // Pointer initialized with null
    pvalue  = new double;   // Request memory for the variable

    *pvalue = 29494.99;     // Store value at allocated address
    std::cout << "Value of value : " << value << std::endl; // This is stored on stack
    std::cout << "Address of value : " << &value << std::endl; // 0x7ffedfd08a30 (just below 128 TB)

    std::cout << "Value at pvalue : " << *pvalue << std::endl; // This is stored on heap
    std::cout << "Value of pvalue : " << pvalue << std::endl; // 0x7fd05f402830 (just below 128 TB)
    // Even the difference is: 0x2E80906200 (over 186 GB)

    delete pvalue;         // free up the memory.

    return 0;
}
/usr/local/bin/c++-9 heap.cpp -o heap
./heap

Мне было любопытно увидеть диапазоны памяти стека и кучи. Я ожидал, что оба числа будут в пределах общего диапазона физической памяти моей системы: 16 ГБ ОЗУ, 1 ГБ виртуальной памяти, 1 ТБ SSD-памяти. Однако результаты как для стека, так и для кучи показывают лишь 128 ТБ, и даже разница между ними составляет более 186 ГБ:

Value of value : 2
Address of value : 0x7ffee1776a30
Value at pvalue : 29495
Value of pvalue : 0x7fd05f402830

Я исследовал эту странность без хорошего результата. Кто-нибудь может объяснить это, пожалуйста?

1 Ответ

0 голосов
/ 19 июня 2019

Исходя из моего предположения, что 7f0000000000 добавляется к фактическим значениям.

Я посмотрел этот номер и нашел информацию, связанную с Linux:

Приложение прямого теневого отображения (64-битная версия Linux) 0x7fffffffffff 0x7f0000000000;

Похоже, что GCC в Дарвине использует аналогичную схему для префикса пула виртуальной памяти приложения. Поскольку теоретически 64-разрядный процессор может адресовать 16 ячеек памяти EiB ( exbibyte ) (от 2 до 64), от 0x0000000000000000 до 0xFFFFFFFFFFFFFFFF может быть выбрано пространство виртуальной памяти приложения. а также выше обычного адресного пространства физической памяти, чтобы не вступать в конфликт с ним в ближайшем будущем, в то же время находясь в самой низкой 1/512 части 64-битного адресуемого пространства.

Запомни ошеломляющие цифры ... Я отвлекся, чтобы сохранить то, что осталось от моего здравомыслия:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...