4pi*_*ie0 7 c++ memory-management
我正在运行此代码:
#include <iostream>
#include <cstddef>
int main(int argc, char *argv[]){
int a1=0, a2=0;
int a3,a4;
int b1=++a1;
int b2=a2++;
int*p1=&a1;
int*p2=&++a1;
size_t st;
ptrdiff_t pt;
int i=0;
while(true){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我会观察到图像内存(fiolet)的减少:
传说:
我做了这个通用的Win32项目,而不是CLR.我改变了代码,所以我会看到int最终变成负数.现在while()是:
int i=0;
while(0<++i){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
Run Code Online (Sandbox Code Playgroud)
奇怪的是:请看看30000次迭代后发生的事情.为什么我们在图像内存中看到这些波动?我现在可以看到,这可能与VMMap本身有关,因为只有当我选择"启动并跟踪新进程"而不是"查看正在运行的进程"并指向从VS2010运行的exe时才会发生这种情况.这是"已启动和跟踪"流程的屏幕:
我观察到内存的大量分页,这大致开始于图像的下降(这种分页几乎加速并快速触发RAM限制,我设置为2GB):
这是一个只有"查看"的运行进程(从VS2010运行):
那么也许一些受.NET应用程序内存管理影响的问题发生在这里?我还在等待我的int跨越两个补语的边界.
好吧......我必须再次编辑:事实证明,正如之前所想的那样 - 当只查看(未启动)过程时,会出现内存图像效应下降的情况.下面是10分钟后相同过程的附图(仍在等待将int变成负数):
这是:
所以我机器上最大的正2补码是2 147 483 647,最小负值是-2 147 483 648,这很容易验证:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
Run Code Online (Sandbox Code Playgroud)
它给了我相同的结果:-2 147 483 648和2 147 483 647
回到开头,当我评论除了while()循环之外的所有内容 - 同样的事情发生了:在进程运行大约10分钟后,图像正在减少,所以不是无用的代码导致这一点.但什么?
工作集很大程度上受操作系统的控制。您的代码所做的只是在决定是增加还是修剪工作集时考虑的因素之一。其他因素包括您的应用程序是否位于前台、它的活跃程度、堆算法的贪婪程度、由于其他进程的需求而存在多少内存压力等。这是设计使然。
下降可能与 Windows 选择修剪您的工作集有关。由于最初加载的大部分代码可能只是用于初始化而不涉及循环,因此操作系统基于 LRU 算法回收图像页面很简单。
请注意,分配给图像大小的工作集并不是唯一被修剪的部分。