« The First Flight of Vector Eigen | トップページ | 逆算 »

2011年3月30日 (水)缶コーヒーと構造体

おはようございます。本日の当番、プログラマのY.Hです。

最近無駄遣いが多いのに気付き、
1日の缶コーヒーの本数を減らそうと思い立ちました。

多い時で3本ほど飲むので
さすがに多すぎかなと…。

1日あたり100円ですが、お小遣いの節約にもなりますし、
続ければ結構な額になりそうなので、
しばらく続けようかなと思います。


さて、話は変わりますが、
プログラムの中でも節約できる事があります。

※以下の記述は処理系等によって異なる場合があります。
 ご了承ください。


例えば、以下のような構造体があるとします。

struct TEST_A
{
  char m_cTest1;
  int m_iTest2;
  char m_cTest3;
};


で、変数のサイズですが、
今回はとりあえず、
char型 1バイト
int型 4バイト
と考えます。

これらを踏まえると、
上記構造体のサイズは、
1+4+1で一見6バイトと思いがちですが、
実際はアラインメントを考慮しないといけません。

上記の構造体[TEST_A]のサイズをsizeofで調べてみると
12バイトとなります。

僕もプログラムを始めたばかりのころは
6バイトだとばかり思ってました…。

詳しい説明は省きますが、
アラインメントの関係上、このようなサイズとなります。
構造体[TEST_A]の場合は、m_cTest1とm_cTest3の後に、
3バイト分のパディングが入っています。
この領域を使ってサイズの節約ができそうですね。

というわけで、ここでこの構造体を
以下の様に書き換えてみましょう。

struct TEST_B
{
  char m_cTest1;
  char m_cTest3;
  int m_iTest2;

};


この構造体[TEST_B]のサイズをsizeofで調べてみると
8バイトとなります。
なんと、4バイトも節約できました!

変数の並び順に拘る理由が特にないのであれば、
サイズを節約した方が良いですよね。
特に構造体で大きな配列を作った場合は、
数バイトの差でも大きくなる場合があるので、結構重要です。

例えば、上記の構造体では1つあたり、たったの4バイトの差ですが、
この構造体で1000個の配列を作ると
約4KBの差が出てきます。

1000000個の配列を作ると
約4MBの差が!
まぁ実際は、そこまでの大きさの配列を
作ることはないと思いますが…。


構造体のメンバ変数の並び順には、
日頃から気を付けるようにしたいですね。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2011/03/post-9725.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« The First Flight of Vector Eigen | トップページ | 逆算 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 缶コーヒーと構造体:

« The First Flight of Vector Eigen | トップページ | 逆算 »