質問 |
||
| QNo.4026643 | 変数 および ポインタのサイズ(バイト数)について | |
|---|---|---|
| 質問者:PHYOPHYO |
sizeof演算子を使ってchar int float double型のバイト数を調べると、char 型については1バイトと決まっていて、int float doubleについては2から8バイト(処理系によって違う)なのは理解できます。しかし、char* int* float* double*型(ポインタ型)のバイト数は2から4バイトになるのが多いとおもいますが、どういう理由でポインタ型のバイト数が決まるのか、その理由をお教え願いたく思います。16ビットcpuあるいは32ビットcpuと言うハードの影響なのかそれとも何かソフトによるのか、その理由を知りたいと思います。なお私の処理系ではポインタは全て4バイトになっています。特に不思議に思うのはchar型は1バイトなのに、char*型が4バイトになっていることです。 宜しく願います。 |
|
困り度:
|
||
| 質問投稿日時: 08/05/16 15:40 |
||
回答 |
|
| ANo.5 | こんにちは >私の処理系ではポインタは全て4バイト あなたのパソコンはCPUが32ビットだとわかりました。 つまり、32ビットなので約42億個(2の32乗)のメモリがあつかえます。 約42億個のメモリの一つ一つを4バイトのアドレスで管理しているのです。 ではdoubleはアドレスが8個になってしまうではないか? とまたまた疑問に思われるでしょう。 メモリの管理については 「はじめて読む Pentium マシン語入門編」アスキー出版 http://www.ascii.co.jp/books/books/detail/4-7561-4466-7.shtml を読まれるとよくわかります。 「アセンブラ入門 CASLII」 SCC出版局 http://www.scc-kk.co.jp/scc-books/book_data/6074/6074.html を読めばワード、バイトというメモリの確保の仕方もわかります。 この2冊を勉強してください。 これを読んでおけば、これから必ず出てくる構造体のアライメントの疑問も解決できます。 http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html |
|---|---|
| 回答者:materi2 | |
| 種類:アドバイス どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/05/18 15:22 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.4 | メモリモデルを切り替えるのはCPUではなくてコンパイラでした |
|---|---|
| 回答者:php504 | |
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/16 17:12 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答20pt |
|
| ANo.3 | 例えば char a = 1; の場合メモリの特定のアドレスに1という値が保存されます。 アドレスを0x20000000番地とすると 0x20000000 : 01 という具合です。 この場合アドレスは4バイトなのでsizeof(char*)は4になります。 アドレスのサイズはCPUにより決まると考えていいと思います。 スモールモデル(アドレス2バイト)やラージモデル(アドレス4バイト)を切り替えられるCPUもありました。 |
|---|---|
| 回答者:php504 | |
| 種類:回答 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/16 17:05 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| ANo.2 | ポインタには、メモリ上のアドレスが入っています。 そして、データ本体はそのアドレスのところに格納されます。 ポインタに入っているのは、データ型に関らずデータの入っているアドレスですので、全て同じサイズになります。 32ビットのOSですと、アドレスは4バイトで表されますので、全てのポインタ型のサイズは4バイトになります。 |
|---|---|
| 回答者:masa6272 | |
| 種類:回答 どんな人:経験者 自信:自信あり |
|
| 回答日時: 08/05/16 16:48 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| ANo.1 | メモリモデルって言うんじゃなかったかな。 メモリを使う時に必要な「番地」を管理するのに必要なバイト数が、ポインタをsizeofで調べると返ってくるよ。 |
|---|---|
| 回答者:SAYKA | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/05/16 16:09 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |