堆与栈之间的距离

0 c c++ linux memory

我正在运行一个简单的程序,以显示单个进程范围内的堆栈和堆之间的内存容量,并且收到了一些我可能会误解的奇怪值。

我正在运行以下代码块:

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;
}
Run Code Online (Sandbox Code Playgroud)

分配的堆变量和堆栈变量的地址值有意义,但是我相信我在误解如何计算两者之间的内存容量,因为diff一旦我通过转换运行它的最终值在16TB范围内,上面的代码。

我如何有效地将该范围转换为可以理解的内存范围,或者diff如果我犯了一个错误,该如何正确解释?

Nat*_*ica 7

&stackvar - heap是未定义的行为。从中得到的任何结果都是毫无意义的。除非指针指向同一个数组或两个指针都nullptr减去它们都是未定义的行为。在[expr.add] / 5中对此进行了详细说明

当两个指针表达式P和Q相减时,结果的类型为实现定义的有符号整数类型;此类型应与在标头([support.types.layout])中定义为std?::?ptrdiff_t的类型相同。

  • 如果P和Q都得出空指针值,则结果为0。

  • 否则,如果P和Q分别指向同一数组对象x的数组元素i和j,则表达式P-Q具有值i?j。

  • 否则,行为是不确定的。[注意:如果值i?j不在std?::?ptrdiff_t类型的可表示值的范围内,则行为是不确定的。—尾注]

重点矿