x64環境で4GB以上のメモリを確保する方法

このQ&Aのポイント
  • x64環境で連続4GB以上のメモリを確保することは可能でしょうか。
  • OSはVISTA64bit対応で,メインメモリ8GB搭載しており,OSも8 GBを認識しています。
  • メモリ確保の手法は以下の通りです。(VC++2005) img=new unsigned char[4294967295*sizeof(unsigned char)] 上記のように,連続して確保しようとすると,2^32-1=4294967295(約4G弱)Bしかできません。
回答を見る
  • ベストアンサー

x64環境で連続4GB以上のメモリを確保する事は可能でしょうか。

x64環境で連続4GB以上のメモリを確保する事は可能でしょうか。 OSはVISTA64bit対応で,メインメモリ8GB搭載しており, OSも8 GBを認識しています。 メモリ確保の手法は以下の通りです。(VC++2005) img=new unsigned char[4294967295*sizeof(unsigned char)] 上記の様に,連続して確保しようとすると, 2^32-1=4294967295(約4G弱)Bしかできません。 因みに,断続的にメモリを確保すると,7 GBまで取れます。 ソフトかOSか,何かが32bitに縛られている様な気がします。 現在のPC条件 OS   :VISTA Ultimate 64bit対応 CPU   :Core 2 Quad Q6070(64bit対応) 開発環境:VS2005 Team Edition for software developers (プラットフォーム「x64」,「構成プロパティ/リンカ/システム」で  「2GBを超えるアドレスをサポートする」に設定) BIOS  :「Memory Remap Feature」=「enable」 メインメモリ:8 GB もしお分かり頂ける方がいらっしゃったら,是非 ご返答下さい。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • YoxoY
  • ベストアンサー率42% (43/101)
回答No.1

可能かという質問に関しては、可能という答えで間違いないと思います。 http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx 上記の上の方の表の様に 8TB まで取得できるはずで「2GBを超える」はクリアされているべきです。 設定を見直されるべきではないでしょうか。MSDN でお調べ下さい。 http://msdn.microsoft.com/ja-jp/library/h2k70f3s.aspx

NEW2010
質問者

お礼

ご回答ありがとうございます! 回答通り,設定の変更等を調査したのですが, 結局4GB以上メモリ確保は不可能である事が判明しました。 ご紹介頂いたHP <http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx> の下の方に以下の記述がありました。 「64 bit editions of Windows can only attribute a total of 4 GiB of RAM to any single 32 bit virtual memory instance (or application), regardless of your total RAM.」 現在の開発環境がVS2005(32bitアプリケーション)であるため, サブシステムとしてWOW64を駆使して64bit開発環境でクロスコンパイルを 行い,メモリのヒープ領域をint32(つまり4GB)まで取得するようです。  ●原因は32bitアプリケーションにあるようです。 お休みの中,難解な質問にお答え頂き誠に感謝しております。 今後の方針が決まりましたので,問題は解決したと考えております。 YoxoY殿,また是非とも,今回の様に有効なご回答をして頂ける事を, 皆様の問題解決にご活躍頂ける事を切に期待しております。 また,よろしくお願い致します。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

> img=new unsigned char[4294967295*sizeof(unsigned char)] この記述の問題ではないでしょうか。 C/C++で単純に数値リテラルを書くとunsigned int型になるので32bit上限でしょう。 VC++64bitでのunsigned longが何bitか知りませんが、64bitあるならL付きリテラルで書いたらどうでしょうか。 何にせよ64bitリテラルを記述する方法はあるでしょうからマニュアル等で調べて試してみて下さい。

NEW2010
質問者

お礼

ご回答ありがとうございます! 数値リテラルについて調査致しました! img=new unsigned char[4294967296ul*sizeof(unsigned char)] 上記の様にul(=unsigned long)と記述しても 4GBメモリ確保には至りませんでした。 rinkun殿,お休みの中にも関わらず難解な問題に ご対応頂いて本当にありがとうございます。 また是非rinkun殿のお力を賜りたいと思いますので, 今後ともよろしくお願いします。

関連するQ&A

  • メモリ2GBを4GBにしても変わらない?

    PCについてあまり詳しくないのでお聞きします。 OSをWINDOWS7にして、メモリを2GB→4GBにしようと思っているんですが、32bit版だと4GBにしてもあまり変わりませんか? 実際、4GBにしても使用量?はそれ以下だと聞きました。 64bit版にしようと思ったんですが、古いプリンタとかありますし、64bitだと色々対応してなかったりするみたいなので。 限界までメモリ増やしておきたいなぁと思ってるところです。 回答宜しくお願いします。

  • 2GBメモリ x 2 + 1GBメモリ x 2

    数値計算で使用しているパソコンですが、現在1GBメモリが 4枚刺さっています。 これを2GBメモリ x 2 + 1GBメモリ x 2にして使用する場合、 1GBのメモリが2GBのメモリでの処理のボトルネックとなる ようなことがありますでしょうか。 CPUはcore2quad, OSはlinuxにて4coreを並列に動かして 計算をしています。

  • オンボード・グラボと、メインメモリ3GBの壁

    32bitのWindows OSには、約3GBの壁があり、4GBのメモリを搭載しても、残り1GB程は、使われずに遊んだままになるようです。 グラフィックボードには、増設カード上で動作し、増設カード上のメモリを使うタイプと、 マザーボードに機能が搭載されていて、マザーボード上のメモリ(つまりメインメモリ)を消費するタイプがあるようです。 で、ここからですが、 32bitに4GBのメモリを搭載している場合、約3GBの壁により、それ以上メモリは使えないですが、 オンボード・グラフィックボードの場合は、グラフィック用のメモリを約3GBの壁の外側から取るのか内側から取るのかが知りたいです。 確保の優先順番の話です。 先に、オンボード・グラフィックボードが確保し、余った中からメインメモリが割り当てられるのか、 メインメモリが先に割り当てられた後に、その中から、オンボード・グラフィックボードが要領を借りにくのか。 以上、よろしくお願いします。

  • XPS720で4GBメモリは無駄でしょうか?

    Dell XPS720をWindows Vista Ultimateで購入しようと思っています。 メモリは4GBにしようと思っているのですが、知人から「32bitOSでは4GB積んでも3GB前後しか使えないので無駄」と言われてしまいました。でも、DellのWebストアカスタマイズでは64bit版Vista Ultimateも3GBメモリも選択できませんし、DellのWebページでそのようなことについての注意書きもありませんでした。 32bit版Vista Ultimateの場合、4GB実装の場合と3GB(デュアルチャンネルの問題があるので1GB*2+512MB*2にしたいです)実装の場合で使えるメモリ量はたいしてちがわないのでしょうか。また、3GB実装にしたら今度は2GBくらいしか使えない等の制限があるのでしょうか。(でも、3GB実装のとき2GBしか使えなかったら、1GB実装のとき0MBになってしまいますから、ありえないですよね) 詳しい方教えてください。よろしくお願いします。

  • メモリ4GBの認識について。。

    こんにちはー。 早速ですが、本題に。。 pcのメモリについてなのですが、新しく買うパソコンを4GB(2Gx2)にしようと思っています。(というか標準仕様・・。 OSがWindows XP 32bitまたはVista 32bitの場合は3GB程度の認識になるのは分かるのですが、動作に問題は無いのでしょうか? メモリが増えるのは大いに有難い事なのですが、動作に支障を来たすのなら2GBにしようと思うのですが・・・・・。 アドバイス、宜しくお願いしますー。

  • メモリ2GBにしたいが・・・2GB×1?1GB×2?どっちが良い?

    こんにちは。 XPで使うPCを組んだのですが、 Vista風にサイドバーを常駐させたりしたいので、 メモリは2GB欲しいと考えています。 そこで、メモリを乗せるには2GB×1と1GB×2のどちらがよいでしょう。 スロットは4つあり、最大2GB×4まで搭載可能(64bit版OSですべて認識)だそうです。 将来的な増設や、 メモリだけ、もしくは本体ごと売ってしまうときのことを考えると、 どちらが良いか迷っています。 2GB×1枚挿しですと、シングルチャネルですが、 体感的にはデュアルチャネルと大差ないと聞きますし、 メモリも増設しやすくて良いかなとも思います。 売るのは早くても3,4年後でしょうから、 そのころには1GBのメモリなんて 2枚組みでもあまり売れなそうですし・・・。 でも、2枚セットのほうが売りやすいかなとも考えてしまいます。 デュアルチャネルや同一ロットに拘りのある人も多そうですし・・・。 アドバイスをいただけると助かります。 よろしくお願いいたします。

  • 「動的確保した2次元配列のメモリ解放」を関数化したい

    質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

  • 32bitのアプリは、64bitOS上ではメモリが4GB以上使われるか

    32bitのアプリは、64bitOS上ではメモリが4GB以上使われるのでしょうか? PCのメモリは8GBを積んでおります。3DCGソフトは32bit版です。 32bitのソフトのままでOSを64bitに変えた場合、 8GBのメモリは、有効に使えますか?

  • Win OSのメモリの 2GB、4GB の認識問題

    基本的な質問です。 Win OSのメモリの 2GB、4GB の認識問題について色々と調べていましたら、(2^32)/1024/1024/1024=4.096 GB という記述がありました。 しかし、この式で疑問があるのですが、これはバイトではなく、どこにも「/8」という式がないので、ビットで の答えにはなってないのでしょうか。 32本のバスからの算出であれば、bit/本で最後の答えは「4Gb」とはならないのでしょうか。

  • 32bitOSの4GB以上のメモリについて

    いつも参考にさせていただいています。 32bitOSへの4GB以上のメモリ搭載について質問です。 4GBまでであれば、PAEや/3GBオプションでカーネル1GB+プロセス3GBにすることができると思います。 しかしOSがEnterpriseEditionで32bitで16GBくらいのメモリを搭載した場合、このPAEオプションはどのように動くのでしょうか。 カーネル4GB+プロセス12GBなど、振り分けできるのでしょうか。 SQLServerだと、AWEという機能でプロセスにかなりのメモリを割り当てることができるようなのですが、ORACLE等の他のソフトでも同等の機能があるのでしょうか。 よろしくお願いします。