Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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++ 有没有办法确保数组变量(unsigned int*)在内存中?_C++_Macos_Memory - Fatal编程技术网

C++ 有没有办法确保数组变量(unsigned int*)在内存中?

C++ 有没有办法确保数组变量(unsigned int*)在内存中?,c++,macos,memory,C++,Macos,Memory,我需要为一个非常大的数组中的所有entires设置一些默认值。 这花费了我相当长的时间(110-120毫秒),我怀疑这是因为内存中的未命中 我使用memset/std:fill设置默认值。有没有办法确保数组在memset/fill之前驻留在内存中?假设这是一个大的内存映射文件,您可以使用带有MADV\u WILLNEED参数的libc调用来提示操作系统您将很快访问提到的区域 但是,由于阵列需要足够大,因此产生的系统调用的好处不会被调用的成本所抵消。您可以使用将内存锁定在每页的大小,但最多只能锁定

我需要为一个非常大的数组中的所有entires设置一些默认值。 这花费了我相当长的时间(110-120毫秒),我怀疑这是因为内存中的未命中


我使用memset/std:fill设置默认值。有没有办法确保数组在memset/fill之前驻留在内存中?

假设这是一个大的内存映射文件,您可以使用带有
MADV\u WILLNEED
参数的libc调用来提示操作系统您将很快访问提到的区域


但是,由于阵列需要足够大,因此产生的系统调用的好处不会被调用的成本所抵消。

您可以使用将内存锁定在每页的大小,但最多只能锁定一个固定的数量(我不确定OSX上的限制是什么,但您可以使用
getrlimit
RLIMIT\u MEMLOCK
检查它).

最有可能的情况是,您有一个多核处理器,如果不在单核CPU上使用,像memset这样的函数实际上会降低性能。可能是互斥锁导致了性能下降。请尝试在堆栈上分配内存,而不是动态内存。因为它是一个非常大的阵列,所以我会尝试让自己的内存管理器并将其段存储在多个线程中(但这只是我快速阅读一篇文章后的想法)。一种标准的方法是每个线程使用一个内存分配器。在任何情况下,我都会研究memset以外的内容


也许以下内容会有帮助

你所说的“内存中”是什么意思?常驻?映射到页表中?缓存中?一级缓存中?还有,你的目标是什么操作系统?是的,页面错误。我在Mac上开发的改进是,强制内容驻留在内存中(如mlock())的技巧必须在内存页中出错,就像memset()一样“缓慢”.
mlock
会做到这一点,小心处理-在任何现代操作系统上(当然在操作系统X上,根据OP),写入堆栈和堆没有什么特别之处-都只是(虚拟)内存中的页面-因此调用memset()的速度不会有任何差异堆栈内存vs.堆内存。还要注意,OS X的通用例程或one中有零锁定。@Dave即使线程是自治的,也只有一个内存分配器会在它们之间产生冲突。内存分配器中的锁定只有在分配(或解除分配)内存时才起作用。OP描述的用例只是单个分配,正在编写以初始化它;因此锁定不相关。@Dave Mac OS X 10.6.6版仍然使用1993年的旧版本memset。