c - 现代计算机的堆栈和堆空间

标签 c memory-management heap-memory stack-memory

用 C 语言编写时,启动程序时如何知道内存中有多少可用堆栈空间?堆空间怎么样?

如何知道程序执行期间使用了多少内存?

最佳答案

这都是 Win32 特定的(不是真正 C 特定的,只是操作系统 API):

创建线程时,默认情况下它会获得 1MB 堆栈空间,可以在您使用的任何 CreateThread API 中进行修改。

您可以查看线程信息 block 以查找实际的堆栈信息,但即使有文档记录,该技术并未得到正式支持,请参阅 http://en.wikipedia.org/wiki/Win32_Thread_Information_Block .

此外,对于 32 位应用程序,您最多只能寻址 2GB,因此对于设计上使用大量内存的应用程序,需要注意的是进程虚拟地址空间的总大小(已提交+保留),其中包括所有堆分配。您可以使用 GlobalMemoryStatusEx API 以编程方式访问进程的虚拟内存,请查看 ullTotalVirtual虚拟地址空间的参数。一旦您的进程接近 1.8 或 1.9GB 的 VAS,堆分配和 VirtualAlloc 调用就会开始失败。对于“普通”应用程序,您不必担心 VAS 耗尽,但检查失败分配总是好的。另外,你不应该出现堆栈溢出,除非你有错误,或者设计不好。

关于c - 现代计算机的堆栈和堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3793660/

相关文章:

c - 指针和 const 变量

使用 DSH 将输出编译到文件

java - 如何在Java中在特定内存中创建特定大小的对象?

java - 当进程达到一定内存大小时在 Linux 中重新启动服务

c - 相当于cuda中的memalign

c - 如何用c语言工作函数任何人都可以解释一下

ios - ARC 并释放在方法中创建的对象

javascript - 在 JavaScript 中删除对象

hadoop - 创建具有较大 (>1GB) BytesWritable 值大小的 SequenceFile 时出现 NegativeArraySizeException

JavaScript 堆大小和 Chrome 增加