我已经搜索了一段时间,但没有确定的答案是为什么值类型必须分配在栈上,而引用类型即动态内存或对象必须驻留堆。 为什么不能在堆栈上分配同样的东西?为什么堆栈和堆都需要内存分配
回答
局部变量分配在堆栈中。如果情况并非如此,那么在分配变量内存时,您将无法将变量指向堆。如果需要,您可以在堆栈中分配内容,只需在本地创建一个足够大的缓冲区并自行管理它。
他们可以。实际上,它们并不是因为堆栈通常比堆堆稀少,并且在堆栈上分配引用类型可能会耗尽它们。此外,如果一个函数返回在其堆栈上分配的数据,它将需要在调用者的部分上复制语义,否则有可能返回将被下一个函数调用覆盖的内容。
通过本地机器指令,可以快速方便地将值类型(通常为本地变量)引入和取消范围。复制返回值类型的语义是微不足道的,因为它最适合于机器寄存器。这经常发生,应该尽可能便宜。
值类型总是存在于堆栈中是不正确的。阅读的话题乔恩斯基特的文章:
我明白堆栈范式(嵌套的分配/释放操作)不能处理这需要非嵌套的对象生命周期某些算法。
就像静态分配范式无法处理递归过程调用。 (例如斐波纳契(n)的天真计算为f(n-1)+ f(n-2))
我不知道一个简单的算法,可以说明这个事实。任何建议将不胜感激:-)
任何方法放入堆栈将消失方法退出时。在.net和Java中,如果一个类对象一旦最后一次引用消失,它就会完全被接受(实际上是可取的),但是当引用它仍然存在时,对象消失将是致命的。在一般情况下,编译器无法知道方法创建对象时,在该方法退出后,对该对象的任何引用是否会继续存在。如果没有这种保证,分配类对象的唯一安全方法是将它们存储在堆中。
顺便说一下,在.net中,可变值类型的一个主要优点是它们可以通过引用传递,而不会放弃对它们的永久控制。如果类“foo”或其方法具有结构'boz',foo的方法之一通过引用方法'bar'传递,则bar或其调用的方法可能做任何他们想要的操作' boz'直到他们返回,但是一旦“bar”返回了它所持有的“boz”的引用将会消失。这通常会导致比用于类对象的可混合共享引用更安全和更干净的语义。
- 1. 内存分配,堆栈和堆栈
- 2. Java堆和堆栈内存分配
- 3. 为什么内存分成堆栈和堆?
- 4. 如果大部分数据都堆在堆栈上,堆栈内存的主要重要性/作用是什么?
- 5. 堆栈帧内存分配
- 6. 内存分配(指针和堆栈)
- 7. 需要可执行堆栈和堆内存
- 8. 栈和堆内存
- 9. C++在堆和堆栈上分配内存?
- 10. 在.net中堆栈和堆内存分配
- 11. 静态,堆栈和堆内存分配的地址排序?
- 12. 为什么这个分配堆栈而不是堆?
- 13. POSIX调用堆栈内存分配
- 14. 递归堆栈内存分配
- 15. 动态堆栈内存重新分配
- 16. 基于堆栈的内存分配
- 17. C++堆栈与堆分配
- 18. g ++在堆栈上分配未使用的内存是什么?
- 19. 为什么我们要在堆栈和堆上管理结构
- 20. 堆栈或堆栈分配不正确
- 21. C程序的堆栈和堆内存
- 22. 堆栈和堆内存的影响?
- 23. PIMPL和堆栈分配
- 24. 存储器分配和堆栈
- 25. 这个内存在哪里分配 - 堆或堆栈?
- 26. 成员函数内存分配堆栈还是堆?
- 27. 堆栈/堆中的c#内存分配发生
- 28. 堆栈为空...为什么?
- 29. C堆栈分配
- 30. 什么“堆栈无效,堆栈只支持堆栈1和堆栈5”是什么意思?
所以基本上你正在堆栈上定制托管堆。 ;) – 2010-06-17 17:27:54
@bjarkef - 嘿,一个人不得不做的事:) – 2010-06-17 17:28:21