ページ 11

メモリ

Posted: 2014年8月24日(日) 21:55
by ヤマダン
質問させてください。

変数をひとつ宣言するとします。
int Num=0;

で、質問なんですが
このint型のNumという変数に
数字がいくつ入っていようが
いつ、その値を入れようが

最初から最後?まで
メモリ量は同じなんでしょうか?

たとえば、ですけど
下記の三種類の状態のNumですが

int Num;(初期化していないNum)

int Num=0;(0を代入を代入したNum)

int Num=100000;(100000を代入したNum)

これらのNumのメモリの量は
すべて一緒なんでしょうか?

Re: メモリ

Posted: 2014年8月24日(日) 22:12
by うずら
最初に答えから書くと、この場合はすべてint型なので最初から最後まで、どんな値を入れようと同じサイズになります。

入門書によくある説明ですが、変数は箱によくたとえられます。変数を宣言するというのは箱を作るという行為です。
intという型の箱は仮に卵が8個入る箱だと考してみます。
箱の大きさは卵が一つも入ってなかろうと8個入っていようと箱自体の大きさは変わらないですよね。そういうことです。
ただ12個入れようとしたらあふれちゃいますよね。
それと同じでint型にも許容量の限界があります。4バイトだと仮定すると2147483648が最大の値になります。
それより大きな値を入れようとしても箱が大きくなるわけではないので注意して組むようにしましょう。

Re: メモリ

Posted: 2014年8月24日(日) 22:20
by さんど
結論から言うと、
int Num;(初期化していないNum)
int Num=0;(0を代入を代入したNum)
int Num=100000;(100000を代入したNum)
この3つは、すべて使用するメモリ量は同じです。

int型では、基本的には定義した時点で4バイトのメモリが確保されます。
-2,147,483,648~2,147,483,647の数値を表現することができますが、
例えば「1」を表現する場合には、メモリ上では 0,000,000,001 という扱いをしています。
使用していない桁にはゼロが埋められていることがわかると思います。(厳密には正しくないのですが)
よって、
Num = 0 の場合は 0,000,000,000
Num = 100000 の場合は 0,000,100,000
となり、使用する桁数は同じなので、使用されるメモリ量も同じになります。
(初期化していない場合は、どんな値が入っているのか分かりませんが、4バイトのメモリは確保されています)

10進数として説明していますが、イメージとしてはこんなところでしょうか。

Re: メモリ

Posted: 2014年8月24日(日) 22:22
by みけCAT
うずら さんが書きました:それと同じでint型にも許容量の限界があります。4バイトだと仮定すると2147483648が最大の値になります。
環境依存だと思いますが、間違っている可能性があります。
(2の補数による)符号付き32ビット整数の最大値は2147483647 (0x7fffffff)です。
C言語では、自分の環境のint型に入る値の最大値、最小値は、limits.hに定義されているINT_MAX、INT_MINを参照すればわかります。

コード:

#include <stdio.h>
#include <limits.h>

int main(void) {
	printf("size = %u\n", (unsigned int)sizeof(int));
	printf("max  = %d\n",INT_MAX);
	printf("min  = %d\n",INT_MIN);
	return 0;
}

Re: メモリ

Posted: 2014年8月24日(日) 22:23
by みけCAT
さんど さんが書きました:int型では、基本的には定義した時点で4バイトのメモリが確保されます。
これはJavaでは正しいと思いますが、C言語では環境依存です。
例えば、LSI C-86 試食版でのint型は2バイトでした。

Re: メモリ

Posted: 2014年8月24日(日) 22:29
by ヤマダン
みなさま、ありがとうございます、
箱のたとえも非常にわかりやすかったです。

ということは、
DXライブラリでよく使う画像の読み込み
int A = LoadGraph("画像パス");
も、数字をいれる場合の
int A = 1;
と、なんら変わらないメモリ量ということですよね?

Re: メモリ

Posted: 2014年8月24日(日) 22:32
by みけCAT
ヤマダン さんが書きました:ということは、
DXライブラリでよく使う画像の読み込み
int A = LoadGraph("画像パス");
も、数字をいれる場合の
int A = 1;
と、なんら変わらないメモリ量ということですよね?
同じコンパイラなら、A自体が使用するメモリ量は変わらないはずです。
ただし、画像を読み込むと、Aとは別に画像のデータを格納するメモリが確保されると思います。

Re: メモリ

Posted: 2014年8月24日(日) 22:42
by ヤマダン
みけCAT さんが書きました: ただし、画像を読み込むと、Aとは別に画像のデータを格納するメモリが確保されると思います。
ということは、画像用に宣言した変数たちがあるとして
int A;
int B;
int C;
int D;
この変数たちに一度に
A = LoadGraph("画像パス");
B = LoadGraph("画像パス");
C = LoadGraph("画像パス");
D = LoadGraph("画像パス");
とするより、
それぞれ必要する瞬間にLoadGraphする方が
メモリへの負担はない、ということでしょうか?

たとえば
初期化だけしといて
A = 0;
B = 0;
C = 0;
D = 0;

Bの画像だけほしい瞬間に
A = 0;
B = LoadGraph("画像パス");
C = 0;
D = 0;

として、B用だけの画像のデータを格納するメモリを確保する。

みたいな。

普通なら
A = LoadGraph("画像パス");
B = LoadGraph("画像パス");
C = LoadGraph("画像パス");
D = LoadGraph("画像パス");
と一気に読んでおく、みたいにしますが。

Re: メモリ

Posted: 2014年8月24日(日) 22:59
by さんど
その答えは正しいのですが、一般的には必ずしもそういった使い方をするとは限らないことは覚えておいてください。
確かに必要とする直前に画像を読み込む方がメモリの節約にはなるのですが、
一般的には、起動時などに複数の画像をまとめてロードしておくことが多いです。
とはいえ、しばらく使用しない画像を予め読み込んでおく必要はありませんから、ケースバイケースですが。