////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2003/12/01(Mon) No.234
    配信数： 2690 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００３年１２月１日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはー１話追加
　三人合体ホットハーブに７の２を追加。衝撃の真実？
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html

・表紙壁紙、今週は無理
　ごめんなさい。来週こそは……。


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2003/11/23 (Sun)
　午前中にほとはーとかぶヘッダー。もえたん購入。なつかしレイブン。 
ToHeart 志保シナリオクリア。アニメはプラネテスとぴちぴちピッチがいい
感じ。残業１００時間超えてないし。

2003/11/24 (Mon)
　お昼までまったり。２時から１０時半まで休出。ガンスリンガーガール第
４話がいい感じ。「資格・試験書」。

2003/11/25 (Tue)
　昨日マージしたソースを FTP に上げて、またマージして、ドキュメント
片付けて、引き継ぎ説明をして、デバッグして。月末のリリースに向けてデ
バッグ作業が中心。でもこういうやっつけ仕事が好き。７７７組とか購入。
残業１００時間超えないだけまし？　ほとはー、 Printed や掲示板やキャ
ラ投票やりたいなぁ。誰が一番人気あるん？

2003/11/26 (Wed)
　午前中は忘れた。１１時半に設計担当者レクチャー。その後客先へ。画面
担当の人と一緒にデバッグ。１２時に家に着く。そして副業。世の中副業だ
け？

2003/11/27 (Thu)
　派遣先に行ってノートパソコン持って客先へ。必須項目が画面と移行デー
タで違うから落ちる。１２時に家に着く。

2003/11/28 (Fri)
　９時半客先直出。バグ修正に継ぐバグ修正。分かり切っていたことがいま
さらになって問題に。例外処理がダメすぎる。客はがんばれ。終電で帰る。
月１００時間とか２００時間とかよく残業できるなぁ。

2003/11/29 (Sat)
　１０時に客先へ。引きつづきデバッグ中心。リブレットで書いて VNC 使
ってサーバーに上げて。また終電で帰る。明日はお休み。来週も忙しいけ
ど。表紙壁紙描くかどうか……。そして逆三角形。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第九章　四人　−１１−

　川崎幸治は、限りなく戸惑っていた。
　自分を含む、直援のための精鋭部隊４８名が、本部を離れてこのような山
奥にいる。
　本土決戦を間近に控えて最後の盾となるべく日々研鑽に努めてきた。武装
も最新の物が与えられている。国軍のエリートとしての自負がある。
　なのに。
　『某村を制圧せよ』
　意味の全く判らない命令が下されて、目的も判らないまま夜道を歩き続け
ている。
　鬱蒼と茂る木々が、星々を隠している。ランプの明かりだけを頼りにおう
とつの激しい山道をただひたすら進んでいる。
　こんな山奥に何があるというのだ！？
　声に出すことはないから、周りの者もきっと同じ事を考えている、そう想
像した。
　と。
　明かりが強くなった。
　道が平坦になり、空を見上げると月が見えた。
「全体、止まれ！！」
　指揮官の指示に従い、歩兵部隊として列をなしていく。
「しばし休息を取る。ここから目標まで１時間で到着する。明け方にここを
たち、奇襲を掛ける」
　そう言ってから、指揮官は全員の表情を見る。
「……今回の目的については、我々にも知らされていない。ただ、村を制圧
しろ、とだけ命令されている。何人かの捕虜は必要となるであろう。だ
が！」
　指揮官は銃を地面に打ち付けた。
「我々は精鋭である！　本部隊がこの作戦に抜擢された意味を理解するべき
である！」
　それだけ重要な作戦であり、強固な拠点でもある。
　ただの村が？
「でも、ちょっと数が足りないかな」
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『……大丈夫？』
「たぶん……」
http://www.kab-studio.biz/index.html
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 12.11
パディングとアライメント

「前回は複数データの書き込みと読み込みをしてみました」
『 fread() と fwrite() 使ってね』
「でも、データひとつひとつを書き込むっていうのはちょっと面倒、という
わけで今回は構造体を使ってみます」
『あ、構造体丸ごと書き込んだりすれば簡単だもんね』
「そういうこと。でもそこで注意しなきゃいけない点があるから」
『注意点？』
「まずはファイルは抜かして考えようか。 Version 12.01 ( No.224 ) を思
い出して」
『ん……あ、そういえば構造体のサイズってやったね』
「そう。たとえば」

struct TEST_STRUCT
{
    char m_ch;
    int m_i;
};

「って構造体があるとします。このサイズは？」
『 1 + 4 = 5 ……じゃないんだよね』
「そう、答えは 8 」

void SizeOf_TEST_STRUCT()
{
    TRACE( "%d\n", sizeof( TEST_STRUCT ) );
    // 8
}

『謎よねー』
「ではもうひとつ」

struct TEST_STRUCT_DOUBLE
{
    char m_ch;
    double m_d;
};

「の構造体」
『 int じゃなくて double になってる』
「このサイズは、というと」

void SizeOf_TEST_STRUCT_DOUBLE()
{
    TRACE( "%d\n", sizeof( TEST_STRUCT_DOUBLE ) );
    // 16
}

『じゅ、 16 ！？　なんでそんなに大きいの！？　だって、 double って 8 
バイト……あ！』
「はい火美ちゃん」
『もしかして、 double の倍のサイズになってる！？　さっきのは int の
倍だし』
「その通り！　と、もうひとつ例を見ておこうか」

struct TEST_STRUCT_DOUBLE_2
{
    char m_ch;
    double m_d;
    char m_ch2;
};

『後ろに char が増えた』
「これのサイズはというと」

void SizeOf_TEST_STRUCT_DOUBLE_2()
{
    TRACE( "%d\n", sizeof( TEST_STRUCT_DOUBLE_2 ) );
    // 24
}

『あ”、 24 、ってことは double の３倍？』
「そういうこと」
『……つまり、変数が３つあるから、３倍？』
「ほとんどそうだけど、ちょっと違うかな。正確に言うと、それぞれの変数
に【無駄な部分】が加えられて double と同じサイズになってる、ってとこ
ろかな」
『無駄な部分？』
「この構造体をメモリ上で見てみるとわかるかな」

void Use_TEST_STRUCT_DOUBLE_2()
{
    TEST_STRUCT_DOUBLE_2 stTEST_STRUCT_DOUBLE_2;
    TRACE( "%X\n", &stTEST_STRUCT_DOUBLE_2 );
    // まずは 0xAA で初期化。
    memset
        ( &stTEST_STRUCT_DOUBLE_2
        , 0xAA
        , sizeof( stTEST_STRUCT_DOUBLE_2 ) 
        );
    // 各変数をセット。
    stTEST_STRUCT_DOUBLE_2.m_ch  = 63;
    stTEST_STRUCT_DOUBLE_2.m_d   = 2.0;
    stTEST_STRUCT_DOUBLE_2.m_ch2 = 63;
}

『 memset() って？　ランタイムっぽいけど』
「 memset() は、第１引数のアドレスから第３引数バイトまで、第２引数で
埋めるっていうランタイム。 TRACE() で構造体のアドレスを出してるから
それでメモリウィンドウを見てみて」
『ほい。ん？　どこで止めて？』
「最初は」

    stTEST_STRUCT_DOUBLE_2.m_ch  = 63;

「で止めて、 memset() の結果を見た方がいいかな」
『ほい。お、全部 AA だ』
「 8 バイト単位で改行するとこうなります」

AA AA AA AA AA AA AA AA
AA AA AA AA AA AA AA AA
AA AA AA AA AA AA AA AA

「今度は、最後の } の所まで進めて」
『構造体にデータ入れ終わる所までね。ほい』

3F AA AA AA AA AA AA AA
00 00 00 00 00 00 00 40
3F AA AA AA AA AA AA AA

『だいぶ変わった』
「まず真ん中の行から見て。これは double だから 8 バイトまるまる使い
ます」
『だから AA がないんだね』
「一方、上下の char は 1 バイトしか使わないので、先頭の 1 バイトにし
かデータが入っていません」
『残りは AA のままなんだ』
「つまり、 char の変数として使っている後ろに、 7 バイトの無駄な領域
があるってこと。この無駄な領域を【パディング】って言います」
『パディング？』
「そう、 padding 、英語で〈詰め物〉って意味」
『なるほど。でもさ、これってホント、無駄じゃん。なんでこんなふうに
なってるの？』
「それは、この方がコンピューターにとっては見やすいから」
『見やすい？』
「 Version 4.08 ( No.058 ) でちょっと触れたけど、 int みたいに、コン
ピューターが処理しやすいサイズがあるんです」
『あ、３２ビットだから 4 バイトだと処理しやすい、とかゆーあれね』
「そう。今はひとつの変数が最大 8 バイト単位になるようになっていて、
そうするとコンピューターは 4 の倍数だから処理が楽になるんです」
『そのための無駄ってわけね』
「この、サイズを揃えるっていう仕組みを【アライメント】って言います」
『あらいめんと？』
「 alignment 、〈整列〉って意味」
『確かに並べてるね』
「このアライメントの仕組みがあるから、構造体を作ると自動的にパディン
グが入れられて、サイズが倍数になるんです」
『質問！』
「はい火美ちゃん」
『さっき〈今はひとつの変数が最大 8 バイト単位に〉って言ってたってこ
とは、それって変えられるってこと？』
「そういうこと。これは【プロジェクトの設定】＞【C/C++】
＞【コード生成】ページの【構造体メンバのアライメント】ってところに」
『 8 バイトって書いてある！』
「これを 1 バイトにしてリビルドして、もう一度試してみて」
『ほい』
「まずサイズを見てみます」

    TRACE( "%d\n", sizeof( TEST_STRUCT_DOUBLE_2 ) );
    // 10 

『 10 ！　char + double + char = 1 + 8 + 1 = 10 ？』
「そういうこと。メモリを見てみると、 memset() の直後は」

AA
AA AA AA AA AA AA AA AA
AA

「という感じになってます。その次にデータを入れてみると」

3F
00 00 00 00 00 00 00 40
3F

『うわー、パディングがまるまるなくなってる』
「このように、プロジェクトの設定でアライメントを変えると、構造体の中
身は大きく変わります」
『ここまで変わるんだ……質問！』
「はい火美ちゃん」
『結局、アライメントっていくつがいいの？　デフォルトの 8 でいいの？』
「今はコンピューターの性能がかなりいいから、それほど大きな問題じゃな
いかも。 8 でもいいし 1 でもいいし。ただ」
『ただ？』
「今は CPU に比べて、メモリサイズやネットワークの太さのの方が問題に
なることが多いと思うから、そう考えるとパディング 1 の方がいいかも」
『 CPU はどんどん性能上がってるけどメモリとかまだ高いものね……』

/*
    Preview Next Story!
*/
『でも今回ってバイナリーとかあんま関係なくない？』
「実は、ファイルの読み書きが絡んでくると重要になるんです」
『？』
「アライメントを 8 で書き込んで 1 で読み込んだら？」
『あ……』
「というわけで次回」
＜ Version 12.12 構造体のファイル読み書き ＞
『につづく！』
「この辺はうっかりバグになりやすいから」
『んーでもホントにうっかりって気が……。』


////////////////////////////////////////////////////////////////////
/*                ２００３年１２月８日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはー１話追加予定
　三人合体ホットハーブに７の３を追加予定。

・表紙壁紙？
　さてどうでしょう。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

