Qui*_*zen 1 c++ hardware malloc operating-system
我用C++编写了测试代码:
void handler()
{
std::cout << "allocation failed" << std::endl;
std::set_new_handler(nullptr);
}
int main()
{
size_t allocations_count = 0u;
std::set_new_handler(handler);
try {
while (true) {
new char[1024u * 1024u * 1024u];
++allocations_count;
}
} catch (const std::bad_alloc& e) {
std::cout << e.what() << '\n';
}
std::cout << "allocated " << allocations_count << " GB" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在我的 8GB RAM 机器上,我得到了输出:
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
allocation failed
BigAllocations(5125,0x1050e7d40) malloc: can't allocate region
:*** mach_vm_map(size=1073741824, flags: 100) failed (error code=3)
BigAllocations(5125,0x1050e7d40) malloc: *** set a breakpoint in malloc_error_break to debug
std::bad_alloc
allocated 130676 GB
Run Code Online (Sandbox Code Playgroud)
我分配了 130676GB,我认为这太多了,因为我的存储大小是 500GB,而且我不认为虚拟内存可以处理这么多内存...任何人都可以解释为什么我可以在那里进行大量分配吗?
RAM = 8GB 存储 = 500GB MacBook Pro(13 英寸,M1,2020 年)
64 位可以寻址 9313225 GB 内存。这比您分配的 130675 GB 高出一个数量级。
因此,即使操作系统保留了所有特殊地址范围,虚拟内存也可以轻松适应您分配的内存量。只要你不写入它,它就会包含零,并且不需要存储在任何地方(注意,C++语言不new保证内存包含零,但它显然允许它)。
将您分配的内存初始化为非零,然后看看会发生什么。在 Linux 上,这将触发 OOM(内存不足)杀手,当操作系统耗尽物理内存和磁盘交换来存储数据时,该杀手将开始终止进程。也许 OSX 也做了类似的事情。
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |