Расстояние между кучей и стеком - PullRequest
0 голосов
/ 07 ноября 2019

Я запускаю простую программу, чтобы показать объем памяти между стеком и кучей в рамках одного процесса, и я получаю некоторые странные значения, которые я могу неправильно понять.

Я выполняю этот блок кода:

int main() {
  uint64_t *heap = new uint64_t;
  uint64_t stackvar; 

  uint64_t diff = &stackvar - heap;
  float size = (float) diff/ (1024 * 1024 * 1024);  // conversion to GB

  free(heap);

  return 0;
}

Значения адреса выделенной переменной кучи и переменной стека имеют смысл, но я считаю, что неправильно понимаю, как вычислить памятьемкость между этими двумя значениями, поскольку окончательное значение diff находится в диапазоне 16 ТБ, как только я выполню преобразование в приведенном выше коде.

Как эффективно преобразовать этот диапазон в понятный диапазон памяти,или как правильно интерпретировать diff, если я допустил ошибку?

Ответы [ 2 ]

7 голосов
/ 07 ноября 2019

&stackvar - heap - неопределенное поведение. Какой бы результат вы от этого ни получили - бессмысленно . Если указатели не указывают на один и тот же массив или оба nullptr вычитают их, это неопределенное поведение. Это подробно описано в [expr.add] / 5

Когда вычитаются два выражения указателя P и Q, тип результата является определяемым реализацией знаковым целочисленным типом;этот тип должен быть того же типа, который определен как std :: ptrdiff_t в заголовке ([support.types.layout]).

  • Если P и Q оба имеют нулевое значениезначения указателя, результат равен 0.

  • В противном случае, если P и Q указывают соответственно на элементы массива i и j одного и того же объекта массива x, выражение P - Q имеетзначение i − j.

  • В противном случае поведение не определено. [Примечание: если значение i − j не находится в диапазоне представимых значений типа std:: ptrdiff_t, поведение не определено. - примечание к концу]

мина

0 голосов
/ 07 ноября 2019

Также обратите внимание, что память процесса не обязательно должна быть непрерывной, и указатели могут фактически не указывать на места физической памяти. Это происходит из-за преобразования виртуальной памяти и физической памяти В чем различия между виртуальной памятью и физической памятью? , поэтому в большинстве случаев вы никогда не получите правильное расстояние между кучей стека.

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