相关疑难解决方法(0)

堆栈和堆的内容和位置是什么?

编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,

  • 它们在哪里和它们(物理上在真实计算机的记忆中)?
  • 它们在多大程度上受操作系统或语言运行时控制?
  • 它们的范围是什么?
  • 是什么决定了它们的大小?
  • 是什么让一个更快?

language-agnostic heap stack memory-management dynamic-memory-allocation

7847
推荐指数
27
解决办法
145万
查看次数

堆栈和堆内存的大小

可能重复:
堆栈和堆的内容和位置是什么?

关于ac程序中内存布局的基本概念,我理解:

  • 该语言使用两个主要数据结构堆栈.
  • 创建堆栈以存储子程序的局部变量和簿记数据
  • 创建堆以存储程序的动态分配变量
  • 堆本质上是可变长度的.(在堆栈上不太确定)
  • 通常,编译器/语言负责在执行之前请求OS创建这些数据结构.

问题

  • 堆栈/堆的初始大小是多少?谁来决定呢?
  • 在哪里创建物理内存?我看到一般描述为"在顶级地址中创建堆栈,在低级别地址创建堆"请详细说明

c heap stack memory-management

43
推荐指数
4
解决办法
6万
查看次数

我可以在C/C++中获得堆栈的限制吗?

我的问题很简单明了:如果我有1MB的RAM分配给程序的堆栈,我可以获得开始和结束的地址,或者开始和长度吗?

我正在使用Visual Studio 2013.

c c++ visual-c++

23
推荐指数
2
解决办法
2167
查看次数

如何避免递归函数的堆栈溢出?

例如,如果我们通过跟随函数遍历一个相当大的树,我们可能会得到堆栈溢出.

void inorder(node* n)
{
  if(n == null) return;
  inorder(n->l);
  n->print();
  inorder(n->r); 
}
Run Code Online (Sandbox Code Playgroud)

如何在函数中添加条件或某些东西以防止这种溢出发生?

c c++ stack-overflow recursion

12
推荐指数
2
解决办法
1万
查看次数

C++绿色线程的堆栈分配

我正在做一些C++绿色线程的研究,大多数boost::coroutine2和类似的POSIX函数一样makecontext()/swapcontext(),并计划在其上实现一个C++绿色线程库boost::coroutine2.两者都需要用户代码为每个新函数/协同程序分配一个堆栈.

我的目标平台是x64/Linux.我希望我的绿色线程库适合一般用途,因此堆栈应该根据需要进行扩展(合理的上限很好,例如10MB),如果堆栈在未使用太多内存时可能会收缩,那就太好了(不需要) ).我还没有想出一个合适的算法来分配堆栈.

经过一些谷歌搜索,我自己想出了几个选项:

  1. 使用由编译器实现的拆分堆栈(gcc -fsplit-stack),但拆分堆栈有性能开销.由于性能原因,Go已经远离拆分堆栈.
  2. 分配一大块内存,mmap()希望内核足够聪明,可以保留未分配的物理内存,只在访问堆栈时分配.在这种情况下,我们受内核的支配.
  3. 保留一个大的内存空间mmap(PROT_NONE)并设置一个SIGSEGV信号处理程序.在信号处理程序中,当SIGSEGV由堆栈访问引起时(被访问的内存在保留的大内存空间内),分配所需的内存mmap(PROT_READ | PROT_WRITE).这是这种方法的问题:mmap()不是异步安全,不能在信号处理程序内部调用.它仍然可以实现,但非常棘手:在程序启动期间为内存分配创建另一个线程,并用于pipe() + read()/write()从信号处理程序向线程发送内存分配信息.

关于选项3的更多问题:

  1. 我不确定这种方法的性能开销,当内存空间由于成千上万的mmap()调用而极度分散时,内核/ CPU的性能/坏程度如何?
  2. 如果在内核空间中访问未分配的内存,这种方法是否正确?例如何时read()被召唤?

绿色线程的堆栈分配还有其他(更好的)选项吗?如何在其他实现中分配绿色线程堆栈,例如Go/Java?

c++ memory-management green-threads boost-coroutine

12
推荐指数
1
解决办法
1316
查看次数

为什么堆栈大小有限制?

可能重复:
堆栈和堆的内容和位置

我安装的Ubuntu的默认堆栈大小限制为8 MB.但我很好奇为什么我们需要限制用户程序的堆栈大小.同一个程序可以通过malloc/mmap等使用它的所有4 GB(32位程序)可寻址空间.那么为什么我们需要一个堆栈大小限制呢?为什么堆栈不能增长直到它几乎遇到堆?

stack callstack

7
推荐指数
1
解决办法
6518
查看次数

从Linux进程分配的堆栈内存在哪里?

我们知道,当创建一个进程时,会为此进程分配一个堆栈.在linux中,堆栈的大小通常为8 Mb.我的问题是,从这个堆栈分配的位置?从用户空间还是从系统空间?

unix linux operating-system

3
推荐指数
2
解决办法
3908
查看次数