面试题:一个进程的堆和栈有多大?

无无无无无无无无 2013-04-24 02:31:29
面试题:一个进程的堆和栈有多大?

面试官应该是要一个定量的大小,我当时回答:不知道,但堆比栈大得多。面试官重复:大得多!

不知道说对没有!
...全文
14537 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
忧伤绿豆 2015-07-23
  • 打赏
  • 举报
回复
你要是非要一个定量大小=。=要不一个个sizeof?
忧伤绿豆 2015-07-23
  • 打赏
  • 举报
回复
具体看系统和硬件吧,在vs2010里面分配了堆和栈都是4kb物理大小 1m虚拟大小, 当他都是1m用的 理论上说利用内存管理的技术,可以把虚拟内存设置的非常大= =!具体多大我也不知道,vs里面就可以设置的
bigbug_zju 2014-09-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/bigbug_zju/article/details/39525281
  • 打赏
  • 举报
回复
谢谢各位网友大侠的回答。 下面所在 stackoverflow 上看到相关的讨论:http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap 结贴!
mujiok2003 2013-04-26
  • 打赏
  • 举报
回复
栈大小固定(编译时确定),堆的大小实际上(运行时)动态变化的,但有理论最大值:进程空间大小-内核空间大小-栈大小-全局空间。
赵4老师 2013-04-26
  • 打赏
  • 举报
回复
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533 VMMap is a process virtual and physical memory analysis utility. It shows a breakdown of a process's committed virtual memory types as well as the amount of physical memory (working set) assigned by the operating system to those types. Besides graphical representations of memory usage, VMMap also shows summary information and a detailed process memory map. Powerful filtering and refresh capabilities allow you to identify the sources of process memory usage and the memory cost of application features. Besides flexible views for analyzing live processes, VMMap supports the export of data in multiple forms, including a native format that preserves all the information so that you can load back in. It also includes command-line options that enable scripting scenarios. VMMap is the ideal tool for developers wanting to understand and optimize their application's memory resource usage. 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
特招 2013-04-25
  • 打赏
  • 举报
回复
linux系统下默认栈大小是10M,windows系统下默认栈大小是1M. windows下用vs2010编译C++程序时,编译属性中可以重新设定栈大小. 堆的话,理论上内存有多大,就可以建多大. 但32位的程序在64位系统上运行的时候,一个进程的堆大小应该是不可以超过4G的.
  • 打赏
  • 举报
回复
引用 3 楼 lfm13720 的回复:
你可以回答:“你SB吗,栈是线程的,不是进程的”
我可能记错了,栈是和线程相关的。
tonforce 2013-04-25
  • 打赏
  • 举报
回复
栈的大小跟操作系统有关系 在windows 32位平台,理论上应该是1M,但实际上还没达到。 dos下更小。 堆这个问题,虚拟内存有多大,理论上堆就能有多大,但实际上也不能那么大。
youyou1912 2013-04-25
  • 打赏
  • 举报
回复 1
栈和线程相关, 默认1MB预留, 初次递交8KB, 自动增长, 具体使用要看线程调用栈了. 所以如果进程中有N个线程. 默认情况下, 有N*1MB的栈预留空间, 和小于这个数字的实际使用. 堆和Heap管理有关, 默认存在系统堆和CRT堆. 具体大小取决于程序本身对内存的分配和使用, 可以调用HeapSize看实际使用大小. 另外还有虚拟内存, 独立于对堆外, 直接通过VirtualAlloc预留或分配. 也属于进程动态分配的内存.
赵4老师 2013-04-25
  • 打赏
  • 举报
回复
Visual C++ 编译器选项 /F(设置堆栈大小) 请参见 发送反馈意见 设置程序堆栈大小(以字节为单位)。 /F[ ]number 参数 number 堆栈大小(以字节为单位)。 备注 如果不使用此选项,堆栈大小默认为 1 MB。number 参数可以用十进制或 C 语言表示法表示。参数的范围可以在 1 到链接器接受的最大堆栈大小之间。链接器将指定值向上舍入为最接近的 4 个字节。/F 和 number 之间的空格可选的。 如果程序获得堆栈溢出消息,则可能需要增加堆栈大小。 也可通过下列内容设置堆栈大小: 使用 /STACK 链接器选项。有关更多信息,请参见 /STACK。 对 .exe 文件使用 EDITBIN。有关更多信息,请参见 EDITBIN 参考。 在 Visual Studio 开发环境中设置此编译器选项 打开此项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。 单击“C/C++”文件夹。 单击“命令行”属性页。 在“附加选项”框中键入编译器选项。 以编程方式设置此编译器选项 请参见 AdditionalOptions。 请参见 概念 编译器选项 设置编译器选项 发送反馈意见,就此主题向 Microsoft 发送反馈意见。 看来默认大小是1MB,不是我上面说的4MB
赵4老师 2013-04-25
  • 打赏
  • 举报
回复
引用 8 楼 daoluanxiaozi 的回复:
引用 7 楼 zhao4zhong1 的回复:纠正楼上: 堆≈虚拟内存大小-1GB虚拟内存不是 2g 吗?还有,栈的 4M 是怎么计算的呢,求解答。
/F (Set Stack Size) Home | Overview | How Do I | Compiler Options The /Fnumber option sets the program stack size to a specified number of bytes. If you don’t specify this option, a stack size of 1 MB is used by default. The number argument can be in decimal or C-language notation. The argument can range from a lower limit of one to the maximum stack size accepted by your linker. (The linker rounds up the specified value to the nearest 4 bytes.) A space is optional between /F and number. You can also set stack size by using the linker’s /STACK option or by running EDITBIN on an .EXE file. You may want to increase the stack size if your program gets stack-overflow diagnostic messages.
就是那个党伟 2013-04-25
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
堆≈物理内存-1GB 栈通常为4MB
栈的大小和系统有关吧? 不过一般都是1M-4M
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
纠正楼上: 堆≈虚拟内存大小-1GB
虚拟内存不是 2g 吗?还有,栈的 4M 是怎么计算的呢,求解答。
赵4老师 2013-04-24
  • 打赏
  • 举报
回复
纠正楼上: 堆≈虚拟内存大小-1GB
赵4老师 2013-04-24
  • 打赏
  • 举报
回复
堆≈物理内存-1GB 栈通常为4MB
昵称是神马 2013-04-24
  • 打赏
  • 举报
回复
引用 3 楼 lfm13720 的回复:
你可以回答:“你SB吗,栈是线程的,不是进程的”
是一个进程一个堆,一个线程一个栈吗
昵称是神马 2013-04-24
  • 打赏
  • 举报
回复
引用 3 楼 lfm13720 的回复:
你可以回答:“你SB吗,栈是线程的,不是进程的”
我勒个去,那面试官生气了咋办
lfm13720 2013-04-24
  • 打赏
  • 举报
回复 1
你可以回答:“你SB吗,栈是线程的,不是进程的”
  • 打赏
  • 举报
回复
引用 1 楼 sduxiaoxiang 的回复:
不明白面试官想问啥
已经很明白了,一面的题。
加载更多回复(1)

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧