2012-02-20 3 views
2

私はSDL_Surfaceにポインタを使用しており、この場合、私は思ったんだけど:NULLに初期化されたポインタの配列のメンバはメモリを占有するのですか?

個々の表面ポインタの一部は、そのクラスのコンストラクタでNULLに初期化してから使用されることはありません
SDL_Surface* Images[8][7]; 

は、それらの場合よりも多くのメモリを占有します別々に保管した。ご想像のように、列挙を使用すると、これらのサーフェスポインタへのアクセスが簡単になり、if文またはswitch文は必要ありません。たとえばImages [0] [3]〜Images [0] [7]はすべてNULL、NULLなどです。

編集:「まま別の」の意味は、ポインタ変数名と7未満

補遺があるその画像の一部の値としてNULLを避けるための小さな配列を持っていますしてくれてありがとうみんな雷の応答、それは私には明らかです。私は2次元配列を使って前進し、他の配列も他のイメージグループにもあります。

+1

「別々に保管されていた場合よりも多くのメモリを占有する」この意味はわからない – macduff

+0

フィードバックに感謝の意を付けて編集を追加しました。 – formerBGIuser

答えて

2

ポインタを配列で宣言しても、個別に1つずつ宣言しても、同じ量のメモリが消費されます。もちろん、ポインタを個別に宣言することでより少ないポインタを宣言できれば、より少ないスペースが消費されます。

3つのポインターのためだから、次の2行の両方の予備スペース:あなたのコードサンプルに関与ポインタの小さな数を考えると

SDL_Surface* surfaces[3]; 
SDL_Surface *surface1, *surface2, *surface3; 

、あなたが最も読みやすいコードになりアプローチを選ぶ必要があります。あなたの配列が巨大であり、ポインタのうちの小さな部分だけがnullでない場合に限り、配列内の未使用ポインタのオーバーヘッドを気にする価値があります。

+0

私はあなたの答えが最高、高すぎるのが好きです。 – formerBGIuser

+1

どちらの回答があなたの質問に最もよく答えるかは、受け入れたものとしてマークする必要があります。詳細については、こちらを参照してください。http://meta.stackexchange.com/questions/5234/ –

2

NULLに初期化されたポインタの配列のメンバがメモリを占有するのですか?

ポインタは、アドレスの場所を格納するのに十分なメモリを占有する型です。
そうです。変数が初期化されているかどうかにかかわらず、メモリを占有する他のデータ型と同じように宣言されると、メモリを占有/消費します。

2

配列は動的に割り当てられないため、各要素にはコンパイル時にメモリが割り当てられます。しかし、nullで初期化されたポインタは、追加の割り当てられたメモリを指しません。

私はそれがあなたが求めていることを望みます。

2

NULLに初期化されたポインタはメモリを使用しますが、ポインタに必要なバイト数のみを使用します。

1

nullポインタは、他のデータポインタと同じ領域を占有します。保存する内容は、データオブジェクトに割り当てられたメモリ領域になります。

enumなどを使うべきかどうかに関しては、私の主な関心事は、配列のC++配列が理想的ではないということです。配列の行全体または列が空の場合、私はそれを定義することは間違いありません。読みやすく保守してください。

+0

ありがとうございます。すべての行には、既存の最小限のnullメンバーが1つあり、一部の行にはすべての列があります中古。列挙型は行のみを参照し、列は実際のアクセス番号(0,1など)を使用します。このプログラムは実際には(私の基準では)大きく、15,000行ありますので、この場合は可読性と保守性が向上するはずです。 – formerBGIuser

0

ポインタは、ちょうどメモリアドレスを格納する目的を持っているint,doubleなどのような別のデータ型にすぎません。通常、ポインタはアーキテクチャに応じて32ビットまたは64ビットになりますが、他のハードウェアではそれ以上のものが必要になります。

int配列はそうあまりにも(NULLは、一般的にちょうど0として表される)その値が0であっても、ポインタ配列テイクスペースを行い


、値が0の場合であってもスペースを取ると同じように上記のコードは、30×4バイト= 120バイトを予約します

int array[30]; 

はたとえば、アーキテクチャを想定/コンパイラは、32ビットのintを使用します。どの値を格納するかは関係ありません。


のは、今あなたは64ビットマシンにしていると仮定しましょう:

int *ptr_array[30]; 

上記のコードは関係なく、あなたが保存何ポインタ値の30×8バイト= 240バイトを予約します。

あなたは30個の個々のポインタを書き込むこととしてこれを想像することができます:我々は唯一のポインタがメモリ内で消費するサイズの話をしている

int *ptr1, *ptr2, *ptr3, ..., *ptr30; 

注意を。通常、ポインターが指し示す場所(ヌル以外の場合)には、メモリーが予約されています。そのメモリはもちろん、あなたが割り当てた量に応じて変わります。その意味では、ポインタをnullにすることは、ポインタを指すことは何もないことを意味し、メモリ消費量を減らすことにつながります。

+0

-1 * "上記のコードはスタックに30 x 4バイト= 120バイトを予約します" *は間違っていますが、C++標準ではどこにでも* stack *は記述されていません。 –

+0

@Alsあなたは正しいですか。私は答えを修正しました。 –

+0

downvoteを削除しました。 –

関連する問題