FC2ブログ

R_SPHERE

ゲームプログラマー(LV5初プロジェクト終了)の管理人の日常です。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

アラインメント

今日は、プログラムの話です。
興味の無い方はスルーでお願いします。

まずは、以下のソースを見てください。

#include <stdio.h>

void main( void )
{

unsigned int a = 0u;
unsigned int b = 0u;
char testArray[] = { 0, 0, 0, 0, 0, 0, 0, 0 };

void *pA = &( testArray[0] );
void *pB = &( testArray[1] );

a = *( (unsigned int *)pA );
b = *( (unsigned int *)pB );

return;

}

自身でヘッダ付のデータファイルを作成して、読み込む場合などには、
バイト型の配列としてまとめて読み込むと、上記のようなコードができるかと思います。

さて、このソースを実行するとどうなるでしょうか?

正解は、

「問題なく動いたり、停止したりする」

です。

もう少し正確に言いますと、
環境依存で動いたり動かなかったりします。

私の確認した限りでは、
Visual Studio 2008では普通に動作しましたが、
会社のPSPの開発環境ではぶっ飛びました。

さて、ここからが本題です。

この理由ですが、
一般的にunsigned int型変数は4byteです。

そして、一部の環境ではそのアドレスも、
4の倍数でなければいけない、という決まりがあります。
このアドレスを整えることをアラインメントといいます。

では、改めて、上記のソースを見てみますと、
pAとpBが指すアドレスは一つずれていることが分かると思います。

よって、少なくともpAかpBのどちらかの指すアドレスは4の倍数ではありません。
これをunsigned int型にキャストして値を参照しようとすると、
アラインメントのエラーで落ちることがある、というわけです。

環境依存なので、必ず考慮しなければいけない訳ではないですが、
せっかく作ったデータを上手く読めないということも起こり得ますので、
データ作成の際には注意したいですね。
スポンサーサイト
  1. 2009/09/16(水) 20:36:59|
  2. プログラム
  3. | トラックバック:0
  4. | コメント:0
<<ゲームショー2009 | ホーム | PVの話>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsphere.blog55.fc2.com/tb.php/101-13254b8d
この記事にトラックバックする(FC2ブログユーザー)

CLOCK

ACCESS

プロフィール

RYO

Author:RYO
東京近郊在住の
ゲームプログラマー
(LV5 初プロジェクト終了)

Twitter

    follow me on Twitter

    最新記事

    最新コメント

    月別アーカイブ

    カテゴリ

    日常 (25)
    仕事・学校 (34)
    ゲーム・アニメ・マンガ (42)
    レビュー (8)
    プリキュア (23)
    プログラム (5)
    お知らせ (1)
    未分類 (0)

    検索フォーム

    リンク

    このブログをリンクに追加する

    ブロとも申請フォーム

    この人とブロともになる

    QRコード

    QRコード

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。