gpt4 book ai didi

c++ - 快速 RAM 中的动态内存分配

转载 作者:可可西里 更新时间:2023-11-01 12:45:14 40 4
gpt4 key购买 nike

在 Windows 32 位和 64 位机器上,我必须分配内存来存储大量正在直播的数据,总共大约 1GB。如果我使用 malloc(),我将获得一个虚拟内存地址,这个地址实际上可能会根据我拥有的内存量对硬盘驱动器进行一些分页。不幸的是,我担心 HD 会影响性能并导致数据丢失。

有没有办法强制内存只在 RAM 中分配,即使这意味着当没有足够的内存可用时我会收到错误消息(因此用户需要关闭其他东西或使用另一台机器)?我想保证所有操作都在内存中完成。如果失败,可以强制应用程序退出。

我知道另一个进程可能会进入并占用一些内存,但我并不担心,因为在这台机器上不会发生这种情况(它将是机器上唯一进行这种大分配的应用程序)。

[编辑:]到目前为止,我一直尝试按如下方式使用 VirtualLock:

if(!SetProcessWorkingSetSize(this, 300000, 300008))
printf("Error Changing Working Set Size\n");

// Allocate 1GB space
unsigned long sz = sizeof(unsigned char)*1000000000;
unsigned char * m_buffer = (unsigned char *) malloc(sz);

if(m_buffer == NULL)
{
printf("Memory Allocation failed\n");
}
else
{
// Protect memory from being swapped
if(!VirtualLock(m_buffer , sz))
{
printf("Memory swap protection failed\n");
}
}

但是Working set的改变失败了,VirtualLock也是如此。 Malloc 确实返回非空值。

[编辑2]我也试过:

 unsigned long sz = sizeof(unsigned char)*1000000000;
LPVOID lpvResult;
lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);

但是 lpvResult 是 0,所以也没有运气。

最佳答案

您可以使用 mlock, mlockall, munlock, munlockall函数以防止页面被交换(POSIX 的一部分,在 MinGW 中也可用)。不幸的是,我没有使用 Windows 的经验,但它看起来像 VirtualLock做同样的事情。

希望对您有所帮助。祝你好运!

关于c++ - 快速 RAM 中的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14285815/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com