Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows如何知道i';我不使用内存?_C++_C_Windows_Memory Management_Malloc - Fatal编程技术网

C++ Windows如何知道i';我不使用内存?

C++ Windows如何知道i';我不使用内存?,c++,c,windows,memory-management,malloc,C++,C,Windows,Memory Management,Malloc,我注意到这样一种奇怪的效果,即在触摸内存之前,内存没有注册为Windows任务管理器分配的内存,而不是在malloc-ed或new-ed时。这种效果在debug和优化的release版本中都会出现 下面是一个结构示例,尽管在我的代码中,分配和利用发生在不同的线程上,所以我不认为它是优化器,尽管我不确定如何检查 for (int i = 0 ;i < 1000;i++) { buffer[i]=malloc(buffersize); } _sleep(1000*60) for (int i=

我注意到这样一种奇怪的效果,即在触摸内存之前,内存没有注册为Windows任务管理器分配的内存,而不是在
malloc
-ed或
new
-ed时。这种效果在
debug
和优化的
release
版本中都会出现

下面是一个结构示例,尽管在我的代码中,分配和利用发生在不同的线程上,所以我不认为它是优化器,尽管我不确定如何检查

for (int i = 0 ;i < 1000;i++)
{
buffer[i]=malloc(buffersize);
}
_sleep(1000*60)
for (int i=0;i<1000;i++)
{
memset(buffer[i],0,buffersize);//Only shows up the in the resource manager here
}
for(int i=0;i<1000;i++)
{
缓冲区[i]=malloc(缓冲区大小);
}
_睡眠(1000*60)
对于(int i=0;i在分配时和实际填充数据时各一次。因此,按一个按钮(“aquire!”)要求我一次写入64 GB的ram,而不是随着时间的推移,这会增加相当真实的延迟。如果我
malloc
,这会增加太多的延迟

--编辑--


我还禁用了Windows页面文件…

您的操作系统似乎在懒洋洋地分配内存。请参阅问题的答案

基本上,当你调用malloc时,操作系统会给你的程序一个地址,并承诺按照请求的数量提供内存。我读到的类比是,操作系统会为内存“写一张支票”,但只有当你的程序试图用它“兑现”支票时,才会分配物理内存


我认为,如果你想在你
malloc
的时候把延迟影响放在前面,你应该
memset
在那里。

这是像Windows这样的请求页虚拟内存操作系统的标准行为。malloc()call仅分配虚拟内存地址空间。在访问内存之前,您不会真正开始使用RAM。这会生成页面错误,迫使操作系统将您访问的内存页面映射到RAM中

这通常是一个软页面错误,通过从空闲列表中抓取一个RAM页面并映射它来快速处理。与硬页面错误相反,当一些RAM页面由于另一个进程需要RAM而被再次交换到交换文件时,您会遇到这种错误。从磁盘重新加载页面需要更多时间

禁用分页文件有助于避免这些硬页错误。这并不能消除它们,您的代码页也可能会被调出。当您强制操作系统退回到这些错误时,可能会发生这种情况,因为它无法再调出到分页文件。这样的页面在调出时会被丢弃,从可执行文件重新加载当页面重新出现故障时返回文件


如果您有软实时需求,那么最好的策略是尽早分配内存,并在开始承诺快速响应之前有意识地访问内存。只需使用calloc()而不是malloc()即可.

您可以同时尝试
malloc
,并立即为其分配一个空值,以克服NicholasM所说的“惰性内存分配”。即使如此,编译器可能会发现您正在分配但没有使用分配,并将其从编译代码中删除。但不要忘记操作系统为什么会懒散地分配内存。

分配给您的进程的虚拟地址空间不一定由物理RAM支持。一个例子是分页文件,如果物理RAM运行不足,正在使用的内存可能会移动到该文件。但是,如果您从未对其进行过写入,则根本不必分配任何物理RAM或磁盘空间。因此,作为一种优化,一些ting系统提供虚拟地址空间,但实际上尚未为其分配空间。在某些情况下,这是非常有益的。在其他情况下,如您的系统,这有点烦人

也就是说,任务管理器是一个用于调查内存使用情况的非常简单的工具。幸运的是,如果你能够观察到这一点,那么很多问题就不能(可靠地)只用任务管理器来观察

至于如何在不涉及所有内存的情况下避免延迟分配…我不知道有什么方法。甚至
VirtualAlloc
都没有提供解决方法。
通过每页只写入一个字节,您可以稍微降低成本,这仍然会导致物理RAM分配。但请记住,即使您可以避免写入任何内容,Windows也必须分配1600万页,包括页表条目。这肯定需要一些时间。您可以使用大型页(使用
VirtualAlloc
),这会使页面大几百倍,从而将前面提到的1600万页减少到一个更合理的数字。

您对虚拟内存有多熟悉?@delnan还禁用了分页文件…因此,可能不太熟悉。至少您知道它存在,并且与分页有关;-)这就是我正在做的,但它很糟糕,因为我必须立即设置大量内存,这会导致明显的延迟。我建议这样做:
for(…{buffer[I]=malloc(buffersize);memset(buffer,0,buffersize);}