【发布时间】:2011-04-24 09:47:15
【问题描述】:
返回地址和数据是混合/存储在同一个堆栈中,还是在 2 个不同的堆栈中,是这样吗?
【问题讨论】:
返回地址和数据是混合/存储在同一个堆栈中,还是在 2 个不同的堆栈中,是这样吗?
【问题讨论】:
它们是混合的。但是,这取决于实际的编程语言/编译器。我可以想象一个编译器在堆上为局部变量分配空间,并在堆栈上保留一个指向存储的指针。
每个进程中的每个线程都有一个堆栈。因此,例如,一个有 20 个线程的进程有 20 个独立的堆栈。
【讨论】:
正如其他人已经指出的那样,它主要是一个单一的混合堆栈。我将只添加一个小细节:相当新的处理器也有一个小的返回地址缓存,它存储在处理器本身中,它只存储返回地址,而不存储其他数据。但是,除了更快的执行之外,它几乎是不可见的......
【讨论】:
这取决于编译器,但由于 push 和 pop 指令使用单个堆栈指针工作的方式,x86 架构面向单个堆栈。编译器将不得不做更多的工作来维护多个堆栈。
【讨论】:
另外注意:Win32 中的每个线程都有自己的堆栈。所以,当你告诉“windows 程序”时——这取决于它有多少线程。 (当然线程是在运行时创建/退出的)。
【讨论】: