Notifications
Article
[特別企画:Unityスタッフ連載]2週目・名雪 通 [3/5]
Published 16 days ago
115
0
こんにちわ!いちエンジニア、名雪です!
今日はコンピュータを構成する三大要素、CPU・メモリ・GPUのうち、メモリの話をしたいと思います。

メモリの構造

月曜日、メモリにデータを記憶するとお話ししましたが、それではメモリにどのようにデータが記憶されているのでしょうか。
たぶんみなさんがプログラムを学んだ時、「変数は箱のようなものである」という例えを聞いたと思います。メモリはその「箱」が大量に連なっているものと考えることができます。
CPUとメモリーは「バス」で接続されているため、基本的にバス幅の単位で読み書きをすることになります。
例えばデータバスが32ビットのCPUの場合、メモリーは↑のような構造になっています。

エンディアン

基本的にはバス幅の単位で読み書きをするとはいえ、もちろん1バイト単位でアクセスすることもできるようになっています。
それでは4バイトのデータを書き込んだメモリを1バイトずつ読み込んだ時、データはどのような順番になっているでしょうか。実はそれはCPUによって違い、大きく上位バイトから格納するビッグエンディアンと下位バイトから格納するリトルエンディアンという2種類の方式に分かれています。
例えば0x11223344というデータを書き込んだ時は↓のようになります。
※混沌の時代には、リトルエンディアンでもビッグエンディアンでもない順番で格納するCPUもあったと言います(ミドルエンディアンと呼ばれたそうです)。

アライメント

バス幅の単位で読み書きをする都合上、↓のようにそれをまたぐ形でメモリにアクセスすると2回アクセスをする必要が出てきてしまい、効率が悪くなってしまいます。
そのため、データはできるだけバス幅に合わせて配置することが望ましいと言えます。この調整を「アライメント」と言います。
※アライメントされていないメモリへのアクセスができない(エラーが発生する)CPUもあります。

パディング

突然ですが、↓のC#の構造体が何バイトになるかわかるでしょうか?
char型の1バイトとint型の4バイトで5バイトになると思いきや、実は8バイトになります。
これはさきほどのアライメントに合うようにC#コンパイラが構造体に「すきま」を追加しているためです。この「すきま」を「パディング」と呼びます。
※厳密には環境によって変わる可能性があります。

それでは明日

普段何気なく使っているC#の機能にも、CPUとメモリの仕組みからの影響を受けていることがわかったでしょうか?
明日はGPUの話を投稿する予定です。Unityお学びグループに参加して、明日の投稿をお見逃しなく!

Tags:
Toru Nayuki
5
Comments