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の差が!
まぁ実際は、そこまでの大きさの配列を
作ることはないと思いますが…。
構造体のメンバ変数の並び順には、
日頃から気を付けるようにしたいですね。
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント