linux内核如何进32位,在32位Linux内核上使用c在堆上分配超过2GB的空间

这似乎是一个非常普遍的问题,但我还没有找到明确的答案.

我可以访问运行linux的服务器,具有16 GB的RAM和16核(64位)的CPU

(/ proc / cpuinfo给出“Intel(R)Xeon(R)CPU E5520 @ 2.27GHz”).但是,内核

是32位(uname -m给出i686).当然,我没有root权限,所以我无法改变

那.

我正在运行一个我编写的C程序,它做了一些需要内存的计算,所以我

我需要一个大堆 – 但每当我尝试分配超过2GB时,我得到一个badalloc,

虽然ulimit返回“无限”.

为简单起见,我们只说我的程序是这样的:

#include

#include

int main() {

int i = 0;

std::vector<:vector> > vv;

for (;;) {

++i;

vv.resize(vv.size() + 1);

std::vector* 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位指针

可以只容纳2 ^ 32个不同的地址(如果我编译了相同的程序,我是否正确

在同一台服务器上,但该服务器运行的是64位内核,而不是程序可以分配的内核

2GB?)

这不是分配的内存是否是连续的问题,如果我切片更薄

示例程序,同样的问题发生了,在我的实际程序中,没有大块的

记忆,只是很多小的.

所以我的问题是:

有什么我能做的吗?我无法更改操作系统,但当然我可以修改我的源代码,

使用不同的编译选项等……

但我确实需要超过2GB的内存,而且没有明显的方法可以进一步优化

程序使用的算法.

如果答案是明确的“不”,那么知道这一点仍然是好的.

谢谢,

卢卡斯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值