堆与栈之间的距离

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

我正在运行以下代码块:

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的最终值在16TB的范围内通过上面代码中的转换运行它之后。

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

piaoliangdemeimei 回答:堆与栈之间的距离

&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类型的可表示值的范围内,则行为是不确定的。 —尾注]

  •   

强调我的

,

还请注意,进程内存不一定必须是连续的,并且指针实际上不一定指向物理内存位置。这是由于虚拟内存和物理内存转换 What are the differences between virtual memory and physical memory? 因此在大多数情况下,您永远得不到堆之间的正确距离。

本文链接:https://www.f2er.com/3143542.html

大家都在问