我正在Mac操作系统上编写一个简单的C++程序。我只有
int main()
{
int *n = new int[50000000];
}
我在lldb中启动这个程序,并在分配n
的行中放置一个断点。然后我在另一个选项卡中启动top
,我看到内存使用量是336K预分配。当我在lldb中执行n
时,为了进行n的分配,我预计我的内存使用率会上升。然而,顶部显示了我的程序使用的相同内存量。这可能是什么原因?我试图理解C++中内存分配是如何发生的,这就是我这样做的原因。
我还没有退出main的范围。当我再次检查顶部时,我坐在主花括号的末尾。
top
命令显示操作系统查看的进程统计信息。它显示了有多少内存被分配给进程,但没有显示有多少内存在有效使用。它不适用于监视内存分配。
堆和空闲存储的内存分配在C++中取决于实现。但是tt通常不会通过操作系统分配调用进行一一映射。出于性能原因(对操作系统的调用比用户代码内部的调用慢),从操作系统接收的内存分为较大的块:
- 当c++运行时启动时,它通常会从操作系统中分配一些内存,以便为标准库对象分配所需的内存,并初始化空闲存储以快速满足分配请求
- 只有当这个初始内存耗尽时,标准库才会从操作系统中分配更多内存
- 并且在较大的块中再次进行分配,因此不是每个
new
都会引发一个OS调用
根据您的观察,我猜这个初始分配大于50MB。尝试使用更大的值来查看差异。
如果您想更精确地跟踪内存消耗,您需要一些评测工具,例如valgrind
或heap
命令