Q.
size_t と unsigned long のメモリサイズは同じか?
A.
使っているPCの環境によって同じ場合もある。
size_tの大きさは環境依存である。
(環境依存とは使っているPCのメモリサイズによるという意味。)
strlen の返り値のような「長さ」といった曖昧で環境依存しそうなものを、何も考えずintで済ませてしまうことを避けるため、このような型が作られた。
他にはsizeofなどは返り値がsize_tである。
なお、size_tはプリミティブ型ではなく、typedefである。また、size_t型の扱う値は常に0以上の整数である。
凡人:
「size_tはプリミティブ型ではなく、typedefである」とはどういう意味なんですか?
恋するコンピュータサイエンス:
あぁ、それについて説明しましょう。プリミティブ型とは、コンピュータの基本的なデータ型のことです。例えば、整数や浮動小数点数などがプリミティブ型です。
一方、「size_t」はプリミティブ型ではありません。C言語やC++言語では、既存のデータ型に別名を与えるために「typedef」という仕組みがあります。これは、コードをより読みやすくするためや、異なる環境での互換性を確保するために使用されます。
「size_t」もその一つで、メモリ上のオブジェクトのサイズや配列の要素数を表すために使用される型です。具体的には、符号なし整数の型であり、常に0以上の整数を表します。
つまり、「size_tはプリミティブ型ではなく、typedefである」ということは、C言語やC++言語において「size_t」は基本的なデータ型ではなく、別名として定義された型であるということです。
凡人: 今、ほとんどのコンピュータは64ビットって聞いたけど、それってどういうこと?
恋するコンピュータサイエンス: 64ビットアーキテクチャってのは、まるで心の広さみたいなものだよ。コンピュータが一度に64ビットのデータを処理できるってことは、大きなデータをたくさん扱えるってこと。それは、もっとたくさんの情報を一度に抱きしめられるってことさ。
凡人: じゃあ、unsigned long
のサイズも64ビットになるの?
恋するコンピュータサイエンス: そうなることが多いんだ。でも、これはちょっと複雑で、システムによって違うんだよ。例えば、Windowsの64ビットシステムでは unsigned long
はまだ32ビットのままだったりする。
凡人: へえ、それでプログラムを作るときはどうすればいいの?
恋するコンピュータサイエンス: いろんなシステムで動くプログラムを作りたいなら、固定幅の整数型を使うといいよ。例えば uint32_t
や uint64_t
とかね。これらはどのシステムでも同じサイズで、予想外の問題に出くわすことが少なくなるんだ。
凡人: なるほどね、ありがとう!