2

次のコードがあります。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

typedef uint64_t     Huge_num;  // 8 bytes
typedef Huge_num *   Huge_Arr; // Array of 8 byte elements

using namespace std;

// Function: Return a huge array
static Huge_Arr* requestMem(int n)
{
   cout << "requesting :" 
        << (sizeof(Huge_num)*n)/(1024*1024*1024) 
        << "GB" << endl;

   Huge_Arr *buff;
   try {
      buff = new Huge_Arr[n];
   }
   catch (bad_alloc){
      cout << "Not enough mem!" << endl; 
      exit(-1);
   }
   return buff;
}

// Main
int main(){
    for (int i=1; i< 10; i++){
         Huge_Arr *mem = requestMem(i*90000000);
         delete mem;
    }
}

bad_alloc()何らかの理由で、malloc はエラーをスローする前に 2GB を超えるメモリしか取得できません。

32 ビット システムでは、最大アドレス空間が実際には 2GB 程度であることを理解しています。

しかし、私は Ubuntu 12.04 x86_64 を使用しています。これは、より大きなメモリ要求を処理できるはずですよね?

編集:答えはg++ -std=c00x、32ビットであるでコンパイルしていたことがわかりましたか? いずれにせよ、フラグを削除するように Makefile を変更したところ、-std問題なくコンパイルされました。

4

2 に答える 2

5

malloc連続したメモリを割り当てています。2 GB のメモリを要求しているという事実は、badalloc必ずしも 2 GB 未満のメモリが使用可能であることを意味するわけではなく、使用可能なメモリが断片化されていることを意味する場合もあります。システムに割り当て可能なメモリ量をテストする場合は、より小さいチャンクを割り当ててみてください。

于 2013-01-30T19:06:06.520 に答える
2

サイズを増やした場合swap space、割り当て用のスペースを増やすことRAMができます。十分なメモリがない場合、オペレーティング システムは とのスワップによって大きくheap spaceなりdisk spaceます。このため、スワップ ファイルのサイズを変更することができます。

Linux スワップ領域のすべて

他の最善の方法は、overcommittingを onにすることです。値がoffovercommittingに設定されている場合、システムにすべてのメモリを割り当てることはできません。値をオンにすると、すべてのメモリ空間を配列に割り当てることができます。overcommitting

overcommitting値をオンにするには

/proc/sys/vm/overcommit_memoryに設定0

于 2013-01-30T19:56:45.530 に答える