gpt4 book ai didi

c++ - 如何使用 std::vector 等动态数据结构并防止分页?

转载 作者:行者123 更新时间:2023-11-30 01:17:21 25 4
gpt4 key购买 nike

跟进这个问题Vector push_back only if enough memory is available , 我试过从更一般的意义上重新表述问题。

考虑这个片段:

vector<double> v1;
cout << "pushing back ..." << endl;
while (true) {
try {
v1.push_back(0.0);
} catch (bad_alloc& ba){
cout << "bad_alloc caught: " << ba.what() << endl;
break;
}
}

关于上述代码片段,下列哪些说法是正确的?

1) 最终会到达catch block

2) 你无法事先确定是否有足够的内存让push_back不抛出bad_alloc

3) catch block 中涉及内存分配的每个操作都可能失败,因为没有剩余内存

我做的第一件事是在 Windows 上运行这个程序,结果发现在任何分页发生之前,bad_alloc 被抛出,因为显然每个进程的内存量已经超出。这个观察导致下一个声明:

4) 在大多数操作系统上,bad_alloc 将在分页发生之前被抛出,但事先没有确定的方法。

经过一些研究,我对上述陈述提出了以下想法:

A1) 是的,将到达 catch block ,但可能不会在操作系统因分页执行密集的 I/O 操作之前到达。

A2) 是的,至少不是以独立于操作系统的方式

A3) 是的,您必须预分配内存以便对到目前为止收集的 vector 中的数据做一些有用的事情(例如,如果您觉得这有用,请自行进行一些分页)

A4) 是的,这取决于多个特定于操作系统的参数,例如每个进程的最大 RAM 量、进程优先级、操作系统进程调度程序的策略等......

我不确定 A1-A4 是否正确,因此我的问题,但如果是这样,这是下一个陈述:

5) 如果您需要编写一些算法并确保不会出现分页,请不要使用动态数据结构,如std::vector。取而代之的是使用数组并确保它将使用特定于操作系统的函数保留在内存中,例如 mlockall (Unix)

如果 5) 为真,则导致最后一条语句:

6) 没有独立于操作系统的方法来编写不会导致分页的程序。

提前感谢大家分享您对上述陈述的看法。

最佳答案

如果您的程序必须在 Windows/Unix/OS X 上运行,请创建一个包装函数:

bool lockMemoryRegion( void *addr, size_t size )
{
#ifdef WIN32
return VirtualLock( addr, size ) != 0;
#else
return mlock( addr, size ) == 0;
#endif
}

bool unlockMemoryRegion( void *addr, size_t size )
{
#ifdef WIN32
return VirtualUnlock( addr, size ) != 0;
#else
return munlock( addr, size ) == 0;
#endif
}

然后如果您需要锁定 std::vector 使用的内存:

std::vector<int> v( 1000 );
lockMemoryRegion( v.data(), v.capacity() * sizeof (int) );

只有在确实需要时才使用内存锁。将页面锁定到内存中可能会降低系统性能,因为它会减少可用 RAM 并强制系统将其他关键页面换出到页面文件。

关于c++ - 如何使用 std::vector 等动态数据结构并防止分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570391/

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