【问题标题】:Why Object Types needs Dynamic Memory and Primitive types needs Static memory?为什么对象类型需要动态内存而原始类型需要静态内存?
【发布时间】:2012-10-26 12:50:45
【问题描述】:

我正在阅读内存分配概念。我发现一个声明说对象类型需要动态内存和原始类型需要静态内存他们证明它说如果需要动态内存,它是在堆上分配的,否则它会继续堆栈。

我不明白为什么会这样?

感谢每一个帮助。

谢谢

【问题讨论】:

  • 这对我来说听起来非常奇怪。我猜作者的意思可能是原始类型不需要超出其恒定大小的内存,而复杂实体可能在运行时根据它们的状态需要额外的内存。
  • 是的,这就是他们的意思

标签: heap-memory primitive-types stack-memory object-type


【解决方案1】:

这个答案不是 100% 完整的,但其中一些是相关的,我没有代表简单评论......

堆在程序的生命周期内一直存在并且更大(通常),因此可能是设计决定将对象(在 C# 和 Java 等内存管理语言中)分配给堆以不使堆栈过载记忆。此外,堆栈内存本质上与变量范围(何时可以使用)相关联,如果内存管理器将处理对象,则在某些时候执行此操作会更有效,而不是每次变量弹出堆。堆也没有可变大小限制,这更现实地容纳对象,根据其类中定义的内容,对象可能非常大。

这里很好的解释了两者(栈、堆)的区别:
http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx

也很好,但更适合 C:
http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

虽然这些链接都没有专门针对 C# 的 WHY。我可能会因为这个答案而被停靠:)

【讨论】:

    【解决方案2】:

    对象需要动态内存而基元需要静态内存的原因是因为基元类型具有预定义的大小;因此,它们可以放在静态存储器中。对象的大小在运行前可能是未知的,所以内存是动态分配的。

    【讨论】:

    • 这意味着内存是针对这些类型的?
    • 这是不正确的。对象大小在编译时是众所周知的。
    • 我猜这取决于编程语言
    • 例如,如果您从用户那里获取输入,编译器如何知道用户将为字符串输入多少字节?
    • @rharrison33 这与对象大小的概念无关。对象大小是从所有类型对象的编译时已知的对象类型推断出来的,无论它们是否是原始对象
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多