在32位Linux内核上使用c在堆上分配超过2GB的空间
这似乎是一个非常普遍的问题,但我还没有找到明确的答案.
我可以访问运行linux的服务器,具有16 GB的RAM和16核(64位)的CPU 我正在运行一个我编写的C程序,它做了一些需要内存的计算,所以我 #include <iostream> #include <vector> int main() { int i = 0; std::vector<std::vector<int> > vv; for (;;) { ++i; vv.resize(vv.size() + 1); std::vector<int>* v = &(vv.at(vv.size() - 1)); v->resize(1024 * 1024 * 128); std::cout << i * 512 << " MB.n"; } return 0; } 用g(无标志)编译后,输出为: 512 MB. 1024 MB. 1536 MB. 2048 MB. terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted 据我了解,这是32位系统的限制,显然是因为32位指针 这不是分配的内存是否是连续的问题,如果我切片更薄 所以我的问题是: 如果答案是明确的“不”,那么知道这一点仍然是好的. 谢谢, 解决方法
如果你需要一次性内存,不,没有更改为64位内核就没有办法做到这一点(是的,允许你在一个进程中分配更多的内存)
也就是说,如果您不需要同时使用内存,而只需快速访问,则可以随时将部分内存存储卸载到另一个进程. 例如,这可以通过将数据存储在另一个进程中来工作,并让您的进程在需要时临时将共享内存从该进程映射到其自己的内存空间.它仍将存储在内存中,但在切换内存范围时会有一些开销.如果开销是否可接受将取决于您的内存访问模式. 这不是一个非常简单的方法,但是如果不改变内核来为你提供64位的地址空间,听起来你有点像绑定. 编辑:您可以通过重新配置内核将限制提高到2GB以上,但这只意味着您将在那里达到硬限制.此外,这将需要root访问权限. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |