栈和堆的大小
Size of the stack and the heap
我读到 windows 中 c 中的堆栈大小默认为 1 MB,linux 中为 8MB。
但是可以更改大小。
1 - 当我担心大小限制时为什么要使用堆,而我可以更改堆栈以适应所有数据?
2 - 改变堆栈的限制并使其变大有什么缺点?
注意:这个答案需要编辑和扩展更多 dis/advantages...
使用栈的缺点:
- 堆栈上的对象仅在创建块处于活动状态时存在。您可以移交对被调用者的引用 methods/functions,但不能 return 对调用者的引用。
- 堆栈的 space 在程序开始时完全分配,AFAIK。它减少了其他程序的可用内存。堆是动态分配的,可以根据需要增长。
- 除非您的编译器知道该怎么做并且您使用适当的选项进行编译,否则您的程序将不会检测到内存溢出,这可能是由编程错误或错误的假设引起的。
使用堆栈的优点:
- 编写更少的代码。
- 当堆栈上的对象结束其生命时,自动释放已分配 space。
1 - why would i use the heap when i am worried about size limits when i can change the stack to fit all the data ?
重要的不是尺寸,而是寿命。具有 auto
存储持续时间的对象(即,在大多数实现中从堆栈分配)仅在其封闭范围或函数的生命周期内存在。如果您需要在多个函数调用中保持某些内容(例如列表或树中的节点),这很重要。
具有 allocated
存储持续时间的对象(即,使用 malloc
、calloc
或 realloc
从堆中分配)存在,直到您显式取消分配它们 (free
).
2 - what are the disadvantages of changing the limit of the stack and making it bigger ?
您正在假设底层实现可以支持什么,这可能会限制您将代码移植到其他平台的能力(这可能是您关心的问题,也可能不是您关心的问题)。您还在用帧大小换取堆栈深度 - 如果您为每个函数调用预留更多 space,您将 运行 更快地从堆栈中取出 space,这对于深度嵌套调用或递归算法1.
这就是为什么通常的做法是动态分配非常大的对象,或者使它们 static
。
- 诚然,在具有数 GB 虚拟地址 space 的现代托管实现中,这不是主要问题,但在嵌入式平台或其他内存受限环境中可能是个问题。请记住,C 语言是 20 世纪 70 年代初期的产物,当前的许多实践都是在总内存以千字节为单位的系统上开发的。
我读到 windows 中 c 中的堆栈大小默认为 1 MB,linux 中为 8MB。 但是可以更改大小。
1 - 当我担心大小限制时为什么要使用堆,而我可以更改堆栈以适应所有数据?
2 - 改变堆栈的限制并使其变大有什么缺点?
注意:这个答案需要编辑和扩展更多 dis/advantages...
使用栈的缺点:
- 堆栈上的对象仅在创建块处于活动状态时存在。您可以移交对被调用者的引用 methods/functions,但不能 return 对调用者的引用。
- 堆栈的 space 在程序开始时完全分配,AFAIK。它减少了其他程序的可用内存。堆是动态分配的,可以根据需要增长。
- 除非您的编译器知道该怎么做并且您使用适当的选项进行编译,否则您的程序将不会检测到内存溢出,这可能是由编程错误或错误的假设引起的。
使用堆栈的优点:
- 编写更少的代码。
- 当堆栈上的对象结束其生命时,自动释放已分配 space。
1 - why would i use the heap when i am worried about size limits when i can change the stack to fit all the data ?
重要的不是尺寸,而是寿命。具有 auto
存储持续时间的对象(即,在大多数实现中从堆栈分配)仅在其封闭范围或函数的生命周期内存在。如果您需要在多个函数调用中保持某些内容(例如列表或树中的节点),这很重要。
具有 allocated
存储持续时间的对象(即,使用 malloc
、calloc
或 realloc
从堆中分配)存在,直到您显式取消分配它们 (free
).
2 - what are the disadvantages of changing the limit of the stack and making it bigger ?
您正在假设底层实现可以支持什么,这可能会限制您将代码移植到其他平台的能力(这可能是您关心的问题,也可能不是您关心的问题)。您还在用帧大小换取堆栈深度 - 如果您为每个函数调用预留更多 space,您将 运行 更快地从堆栈中取出 space,这对于深度嵌套调用或递归算法1.
这就是为什么通常的做法是动态分配非常大的对象,或者使它们 static
。
- 诚然,在具有数 GB 虚拟地址 space 的现代托管实现中,这不是主要问题,但在嵌入式平台或其他内存受限环境中可能是个问题。请记住,C 语言是 20 世纪 70 年代初期的产物,当前的许多实践都是在总内存以千字节为单位的系统上开发的。