寒いです。

nil
記事: 428
登録日時: 14年前

寒いです。

投稿記事 by nil » 13年前

最近すごく寒いです。
当然北海道ほどではありませんが、京都も結構冷えます。
家の中ですらダウンジャケット着用です。
京都は夏は蒸し暑く、冬は冷える、まさに鉄板です。

そういえば京都人は『寒い』をよく『さぶい』と発音しますが、
それは京都人だけらしいですね。
以前聞いて驚いたのを覚えています。
いつもさぶいさぶい言ってますからね。

物を捨てることを『ほかす』というのも関西人だけのようです。
ものをもとの場所に戻すことを『なおす』というのもそうらしいです。

そういえば先日のせんちゃさんの日記に書かれていた

CODE:

struct{
    unsigned int        objectId        :   8;  //  オブジェクトID
    unsigned int        objectType      :   8;  //  オブジェクト種類(エネミー、プレイヤー、弾幕、アイテムなど)
    unsigned int        user            :   8;  //  衝突判定オブジェクトの所持者
    unsigned int        collisionType   :   8;  //  衝突判定タイプ。通常の衝突、アイテムオブジェクト衝突、ダメージオブジェクト衝突など
 
    unsigned int        handleId        :   30;
    unsigned int        isHit           :   1;
    unsigned int        isActive        :   1;
};
という記述。
このコロンは何なんだろうと調べてみたところ、
ビットフィールドというようですね。
なるほど、ビット単位でメモリのサイズを決められるというのは便利ですね。

CODE:

struct A{
    unsigned a : 1;
};
ですが、これでもAには4byte分のメモリが割り当てられる……なるほどなるほど。
ちょっと試しにこんなコードを書いてみました。
► スポイラーを表示
ほうほう、これなら ビットフィールド1=実質bool型 の変数を32個定義してもサイズは4byteなのですね。
フラグを含んだデータの保存に役立ちそうです。

ならば、と
メイン関数を以下のように書き換えました。

CODE:

int main(){
	printf( "%p,%p\n", &b[0].a1, &b[1].a12 );
}
コンパイルは通りません。
よく考えなくても当たり前ですね。

今年の年末はBaba Yetuです。
バーバー イェッツイェッツ リエーピン グーニー イェッツイェッツ ワミ-ナーが頭から離れません。
[nico]http://www.nicovideo.jp/watch/sm301394[/nico]

少し早いですが、
皆さん、今年はありがとうございました。
良いお年を。

それでは。
最後に編集したユーザー nil on 2012年12月30日(日) 21:00 [ 編集 2 回目 ]

アバター
せんちゃ
記事: 50
登録日時: 15年前

Re: 寒いです。

投稿記事 by せんちゃ » 13年前

おぉぅ、私の日記が引用されていてびっくり(゚o゚;
ビットフィールドはあくまでも32ビットのデータ領域を利用しているだけなので、
アライメントとかには気をつけてくださいね。

構造体のデータ領域の指定全般に言えることですが、
33ビットとか40ビットとかにすると残りの領域がゴミになって新しい領域を指定したりするので、
節約してたつもりが節約できてなかったみたいなことになっちゃいます。

ちなみにビットフィールドはunsigned intで指定するのが一応一般的です。
たまにsigned intで定義する場合もありますが、符号付きなのでけっこう面倒くさいです。
ビットフィールドの主な使いどころとしてはパケット通信とかで1パケットあたりの送信データ量を増やすときとかに使われます。

ビットフィールドで毎回アクセスすると位置指定でパフォーマンスを悪くする危険性があるのでこれも注意です
最後に編集したユーザー せんちゃ on 2012年12月30日(日) 20:18 [ 編集 1 回目 ]

nil
記事: 428
登録日時: 14年前

Re: 寒いです。

投稿記事 by nil » 13年前

ありがとうございます。
修行日記はすごく参考にさせて頂いてます。

アクセスの位置指定に時間が掛かるというのは頭の隅に置いておくべき点ですね。

正直に言うと便利そうだと思う反面特にどこに使っていいのか分からない、というのが本音でして。
それこそ、セーブデータの保存程度しか思いつきませんでしたし……。
しっぺ返しを食らいそうですから濫用は避けようと思います。

アバター
せんちゃ
記事: 50
登録日時: 15年前

Re: 寒いです。

投稿記事 by せんちゃ » 13年前

涼雅 さんが書きました: それこそ、セーブデータの保存程度しか思いつきませんでしたし……。
しっぺ返しを食らいそうですから濫用は避けようと思います。
セーブデータとデータ通信程度で十分だと思います。
少なくともコンシューマ機ではデータ通信のパケットデータ量からビットフィールドを使ったり
セーブする際にビットにして保存するくらいでしか利用していないんじゃないのかなぁと。
(実際のところ私もまだペーペーで低レベルな部分を実装していないので詳しい仕様はわかっていないんですけどねw)

でもハードによっては140KBくらいの領域しかセーブできないなどがあるので、
そのためにビット操作はあるようです。


僕の日記に書いていたのはゲーム内で使用するオブジェクト一つにつき150バイトまでしか使えないメモリ配分にしたので、
ちょっとケチって使っていたのでああなったという感じで参考にしないほうがいいと思います。

アバター
へにっくす
記事: 634
登録日時: 13年前

Re: 寒いです。

投稿記事 by へにっくす » 13年前

涼雅 さんが書きました:それこそ、セーブデータの保存程度しか思いつきませんでしたし……。
しっぺ返しを食らいそうですから濫用は避けようと思います。
せんちゃ さんが書きました:でもハードによっては140KBくらいの領域しかセーブできないなどがあるので、
そのためにビット操作はあるようです。
半分正解、半分間違い。
電子回路で、0か1かのスイッチの切り替えができる部品などがありますが、それを制御するための定義にビットフィールドが利用される場合があるのです。全体8bitの中でLSBから1bit、3bit、4bitに分けて順に何かの役割を与えるとかね。
ゲームセンターなどのゲームの筺体の中にある基盤には難易度を切り替えたり、モニターテストをさせたりするディップスイッチがあります。これもビットフィールドで定義して制御してたりしますよ。ゲームセンターでアルバイトする機会があったら、ぜひのぞいてみてください。
最近ゲームセンターがつぶれまくってて、好きなゲームができなくなって寂しい…
最後に編集したユーザー へにっくす on 2012年12月30日(日) 23:12 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 15年前

Re: 寒いです。

投稿記事 by ISLe » 13年前

ビットフィールドを使っていない構造体でもですが、セーブデータとしてファイル等にそのまま書き出すのは危険ですよ。

nil
記事: 428
登録日時: 14年前

Re: 寒いです。

投稿記事 by nil » 13年前

>へにっくすさん
そのような用途があるとは思っても見ませんでした。
ですが、今のところは縁が無さそうです。
>ISLeさん
それは初耳でした。
調べてみたところ、パディングが処理系依存、という記事を幾つか見つけたのですが、
そうであるという認識でいいんでしょうか?

アバター
tk-xleader
記事: 158
登録日時: 14年前

Re: 寒いです。

投稿記事 by tk-xleader » 13年前

「さぶい」ってのは関西で広域的に通じると思いますよ。僕もよくつかいますし…
(どうも、「ぶ」→「む」という変化の前の言葉が関西には残っているらしいです…)

ISLe
記事: 2650
登録日時: 15年前

Re: 寒いです。

投稿記事 by ISLe » 13年前

涼雅 さんが書きました:調べてみたところ、パディングが処理系依存、という記事を幾つか見つけたのですが、
そうであるという認識でいいんでしょうか?
ビットフィールドや共用体では、エンディアンの違いも影響します。
運用上、同一アーキテクチャのCPUマシン且つ同一の処理系(&同一設定)で作成したプログラム同士でやり取りする場合以外は正しく読み取れる保証はありません。
外部データの形式に応じてバイト配列に変換して書き出し、バイト配列に読み込んで変換して戻す、という処理を挟んでおかないと場合によってはたいへんなことになります。
最後に編集したユーザー ISLe on 2012年12月31日(月) 14:40 [ 編集 3 回目 ]

nil
記事: 428
登録日時: 14年前

Re: 寒いです。

投稿記事 by nil » 13年前

>tk-xleaderさん
そういえばさみしいとさびしいとかもそうですね。

>ISLeさん
なるほど、大変勉強になりました。
ありがとうございます。