0

サイズが 78719476736 バイトの配列があるとします。この配列は、C コードで malloc を使用して動的に割り当てられることに注意してください。この量のメモリを割り当てた後、malloc が有効なポインタを返すと仮定します。この配列のサイズは UINT_MAX(4294967295) を超えています。つまり、unsigned int(32 ビット) の最大制限です。

私のコードが以下のように見えると仮定します。

int *buf;
buf = (int*)malloc(78719476736);

ここで、78719476736 は 4 * UINT_MAX より大きいです。

buf のすべての要素を参照する必要がある場合、buf は int* であるため 32 ビットになるため、malloc(78719476736 バイト) を使用して割り当てたすべてのメモリ要素をアドレス指定することはできません。

私の質問は、上記のコードを変更して buf を long long (64 ビット変数) にするべきではないということです。long long 変数だけが、割り当てた大きなメモリをアドレス指定できるからです。

コードの変更例

unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);

実際、ポインタは 32 ビット幅になり、78719476736 バイトにアクセスできなくなるため、変数 buf はもはやポインタであってはなりません。

したがって、これは単純な unsigned long long int である必要があり、上記の変更されたコードに示されているように、malloc の戻りポインター値を unsigned long long int にキャストし、buf を使用して割り当てられたすべての要素にアクセスする必要があります。

上記の私の仮定は正しいですか?

また

私は混乱していますか/何かが欠けていますか?

編集:それが役立つ場合は、

Intel Core 2 Duo (64 ビット CPU) で WinXP を搭載したデスクトップで作業しています。したがって、CPU に関しては、4 GB を超えるアドレス空間にアクセスしても問題はありません。64 ビットをサポートするために有効にする必要がある他のすべてのコンポーネント、つまり

a.) コンパイル中に 64 ビットのコンパイラ サポートを有効にする方法を教えてください (私は Visual Studio 2005 Professional エディションを使用しています)。

b.) 64 ビットの OS サポート - Windows XP Professional を使用しています。

ありがとうございました。

-広告。

4

6 に答える 6

7
  1. 64 ビット OS が必要です
  2. malloc は、64 ビット プラットフォームでは 64 ビットのパラメータとして size_t を受け取ります。
  3. そして最も重要なことは、おそらく次のように考える必要があるということです。4G よりも多くのメモリを割り当てる必要があるのでしょうか。
于 2009-06-16T12:49:58.763 に答える
5

ポインターとは何かについて深く混乱していると思います。少なくとも一般的なシステムでは、ポインタのサイズ (異なる値の数、つまり異なるアドレスの数) は型に依存しません!

int *a;
short *b;
double *c;

a、b、および c は異なる型へのポインターですが、サイズはすべて同じです (たとえば、32 ビット システムでは 4 バイト)。32 ビットに比べて 64 ビット システムのポイントはまさにそれです。つまり、ポインターから 2**32 を超える場所をアドレス指定できるようにすることです。

また、32 ビット CPU は、ハードウェアで 4 Gb を超えるアドレスを指定することもできません [1]。また、対応する仮想アドレス空間も一般に 32 ビットに制限されます。したがって、8 Gb のメモリの割り当てを解除しても、うまくいく可能性はほとんどありません。

[1] それは完全に真実ではありません。たとえば、Intel CPU には、32 ビット CPU が「拡張」アドレスを使用できるように拡張機能があります。

于 2009-06-16T13:03:46.927 に答える
4

Anint*はポインター型です。78719476736 バイトを割り当てることができるシステムを使用している場合、おそらく少なくとも 64 ビットのアドレスがありますsizeof(int*) >= 8。ポインタのサイズは何の関係もありませんsizeof(int)

于 2009-06-16T12:51:29.523 に答える
1

4GB を超えるメモリに対処するには、そのメモリを選択するメカニズムが必要です。したがって、アプリケーションを 64 ビットにコンパイルする必要があります。そうすれば、すべてのポインターが 64 ビット幅になります。

4GB を超えるメモリにアクセスする唯一の方法は、リアル モード DOS 時代にセグメントとオフセットの混乱で使用したのと同じように、追加のアドレス/メモリ セレクター メカニズムを使用することです。もちろん、これはプロセッサのアーキテクチャに依存します。

于 2009-06-16T12:51:16.560 に答える
1

ソフトウェアを 64 ビット Os で実行し、64 ビット コンパイラ設定を使用すると、すべてのポインターが 64 ビットになります。特に申告は必要ありません。

于 2009-06-16T12:51:28.837 に答える
0

あなたのコンパイラとOSはそれをサポートしていません.

Windows の場合は、_HEAP_MAXREQのドキュメントを参照してください。

いくつかのオプションを読んで、

64 ビットの大きな malloc

于 2009-07-14T06:45:16.357 に答える