Memory 堆栈和内存分配上下文中的堆栈和内存分配到底意味着什么

Memory 堆栈和内存分配上下文中的堆栈和内存分配到底意味着什么,memory,Memory,我读过一些东西,比如在堆栈中分配内存,或者将这些变量放在堆中。我曾经读过一本关于微处理器的书,隐约记得有一些关于堆栈的主题或章节。我知道堆栈也意味着一种后进先出的数据结构 因此,我对堆栈的含义感到困惑。除了被称为堆栈的寄存器之外,每个微处理器中都有内存位置吗?我将描述最常见的情况 在这种情况下,堆栈是程序的专用内存,更准确地说是线程的专用内存。当程序启动时,操作系统会自动分配内存。通常但并非总是,堆栈是从主存分配的,因此它不是CPU中的特殊内存 它的名字叫stack,因为它是后进先出的风格。调用

我读过一些东西,比如在堆栈中分配内存,或者将这些变量放在堆中。我曾经读过一本关于微处理器的书,隐约记得有一些关于堆栈的主题或章节。我知道堆栈也意味着一种后进先出的数据结构


因此,我对堆栈的含义感到困惑。除了被称为堆栈的寄存器之外,每个微处理器中都有内存位置吗?

我将描述最常见的情况

在这种情况下,堆栈是程序的专用内存,更准确地说是线程的专用内存。当程序启动时,操作系统会自动分配内存。通常但并非总是,堆栈是从主存分配的,因此它不是CPU中的特殊内存

它的名字叫stack,因为它是后进先出的风格。调用函数时,其局部变量将从推送到堆栈的堆栈中分配。当它返回时,这些变量从堆栈中释放

关于堆:堆是一个可以比堆栈更灵活地分配内存的地方。堆存储空间通常比堆栈大得多。即使在分配空间的函数返回后,分配的空间仍然可用。对于没有垃圾收集的语言,您必须手动释放分配的空间。不要将此堆与数据结构堆混淆,数据结构堆是完全不同的东西

char *var;
void example(int length) {
  char stackVar[1024]; // a 1024 element char array allocated on the stack
  char *heapVar = new char[length]; // a length sized variable allocated on the heap, and a pointer (heapVar) to this place allocated on the stack

  var = heapVar; // store a pointer to the allocated space

  // upon return, stackVar is automatically freed
  //              the pointer heapVar automatically freed
  //              the space that heapVar points to is not freed automatically, can be used afterwards (via the var pointer)
}

再次感谢。如果我问是什么赋予堆栈上的堆这些灵活性呢?@MikhailTal:从堆栈进行分配很容易,它只是一个指针移动。使用stack,您只能释放最后分配的内存区域,而只能弹出最后一次推送。有了堆,你可以做任何你想做的事。分配一些内存,然后再分配一些,然后释放第一个分配的内存。所以内存中可能有漏洞。从堆中进行分配涉及到分配器端复杂的算法,以提高速度,避免内存碎片等。碎片的发生是因为这些整体,对吗?@MikhailTal:大部分情况下。你可以在