【问题标题】:C++ do stack memory allocation/deallocation defragement memoryC++做堆栈内存分配/释放碎片整理内存
【发布时间】:2011-07-25 06:24:56
【问题描述】:

C++ 做堆栈内存分配/释放碎片整理内存。 当我声明局部内存变量时,它们被分配和释放,是否会使内存碎片化?

从记忆的角度来看,这可能非常重要

堆栈有多少内存可用? 我可以分配吗

 char sam[999999999999999];

【问题讨论】:

  • 请参阅:here 以了解堆栈大小的限制。

标签: c++ memory stack


【解决方案1】:

堆栈有多少内存可用?

视情况而定。


这取决于编译器,并且取决于您启动二进制文件时使用的参数(因为编译器可能决定将堆栈大小的定义推迟到运行时)。它还取决于操作系统和可用资源。

兴趣点,gcc 正在处理SplitStacks。许多语言已经提供了这个(例如 Go),其想法是堆栈可以按需增长。至此,极限就变成了:操作系统一次可以分配多少?

我还没有尝试过……甚至不知道这是否完全实现。

【讨论】:

    【解决方案2】:

    在堆栈上分配内置函数不应导致碎片。但是,如果您在堆栈上分配 string 之类的东西,而堆栈本身不会碎片化,则字符串会在堆上分配内存,可能会碎片化。

    与堆相比,通常堆栈非常小 - 大约 1-64MB,具体取决于您的平台。

    【讨论】:

      【解决方案3】:

      通过在堆栈内存上进行分配和解除分配不会被frgameneted,因为堆栈变量需要多少内存在编译时本身是已知的。关于可以在堆栈上分配的最大内存量取决于编译器。默认情况下,对于 VS 编译器,它的大小为 1 MB,并且可以通过编译器选项进行更改。

      【讨论】:

        【解决方案4】:

        不,内存没有碎片化。您可以在堆栈上分配多少内存是实现定义的,通常约为 1 兆字节。

        【讨论】:

        • 内存碎片化。特别是当使用大量 malloc/free 时。复杂数据结构的布局在碎片化内存上变得更糟(使用更多页面;内存局部性更低;TLB 压力更高)。物理内存可以碎片化(没有单个连续区域可用于大页面分配器)。虚拟地址空间可能是碎片化的(即使有足够的内存以不连续的方式释放,也不会成功的巨大尺寸的 mmap)。
        • @osgx:堆栈分配不使用malloc()/free()
        • 但它使用物理/虚拟映射。堆栈的页面可能以不同的顺序分配。而且...我建议您编辑答案并说“堆栈内存没有碎片化”。
        猜你喜欢
        • 2013-02-28
        • 2011-05-23
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2012-04-03
        • 2018-07-24
        • 1970-01-01
        相关资源
        最近更新 更多