Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

変数領域のメモリ確保を最適化する - SPVM開発日記

今、変数領域のメモリ確保の最適化の作業をしている。

サブルーチンが呼ばれたときに、変数領域のメモリ確保を行う必要があるのだけれど、ポータビリティを保ちつつ、アライメントをそろえつつ、これをできるだけ小さくなるようにする。

数値変数とアドレス変数の違い

数値変数は、どの環境でも同じサイズ。int64_tは8バイト, doubleは8バイト、int32_tは4バイト、floatは4バイト、int16_tは2バイト、int8_tは1バイト。

アドレス変数は、環境に応じて32bitのOSでは、4バイト、64bitのOSでは8バイトとなる。

ポータビリティを保ちつつ、一番小さく並べ替える方法

計算方法は以下である。

  • アラインメントは、数値型の最大の8バイトとする
  • 数値変数を型サイズの大きい順に並べる。8バイトのもの、4バイトのもの、2バイトのもの1バイトのもの。
  • アラインメントが8なので、8の倍数になるようにサイズを切り上げる
  • 最後に、sizeof(void*) * アドレス変数の数を足し算する