【发布时间】:2011-07-25 06:24:56
【问题描述】:
C++ 做堆栈内存分配/释放碎片整理内存。 当我声明局部内存变量时,它们被分配和释放,是否会使内存碎片化?
从记忆的角度来看,这可能非常重要
堆栈有多少内存可用? 我可以分配吗
char sam[999999999999999];
【问题讨论】:
-
请参阅:here 以了解堆栈大小的限制。
C++ 做堆栈内存分配/释放碎片整理内存。 当我声明局部内存变量时,它们被分配和释放,是否会使内存碎片化?
从记忆的角度来看,这可能非常重要
堆栈有多少内存可用? 我可以分配吗
char sam[999999999999999];
【问题讨论】:
堆栈有多少内存可用?
视情况而定。
这取决于编译器,并且取决于您启动二进制文件时使用的参数(因为编译器可能决定将堆栈大小的定义推迟到运行时)。它还取决于操作系统和可用资源。
兴趣点,gcc 正在处理SplitStacks。许多语言已经提供了这个(例如 Go),其想法是堆栈可以按需增长。至此,极限就变成了:操作系统一次可以分配多少?
我还没有尝试过……甚至不知道这是否完全实现。
【讨论】:
在堆栈上分配内置函数不应导致碎片。但是,如果您在堆栈上分配 string 之类的东西,而堆栈本身不会碎片化,则字符串会在堆上分配内存,可能会碎片化。
与堆相比,通常堆栈非常小 - 大约 1-64MB,具体取决于您的平台。
【讨论】:
通过在堆栈内存上进行分配和解除分配不会被frgameneted,因为堆栈变量需要多少内存在编译时本身是已知的。关于可以在堆栈上分配的最大内存量取决于编译器。默认情况下,对于 VS 编译器,它的大小为 1 MB,并且可以通过编译器选项进行更改。
【讨论】:
不,内存没有碎片化。您可以在堆栈上分配多少内存是实现定义的,通常约为 1 兆字节。
【讨论】:
malloc()/free()。