2010年4月20日火曜日

VC++でアラインメントを指定する

Check
ビットマップ読み込み関連で失敗したのでメモ。
struct Hoge
{
    char c;
    int i;
};

上記の構造体サイズは理屈上は5バイトであるが、パディングされてるので実際には8バイトになっている。こいつを確実に5バイトにしたいときは#pragma pack命令を使う。
#pragma pack(push, 1)
struct Hoge
{
    char c;
    int i;
};
#pragma pack(pop)
1バイト単位でアラインメントを調整するので、結果としてパディングされないということになる。

サンプルコード
#include <stdio.h>

struct A
{
    char c;
    int i;
};

#pragma pack(push,1)
struct B
{
    char c;
    int i;
};
#pragma pack(pop)

int main()
{
    printf("sizeof A: %d\n", sizeof(A));// >> sizeof A: 8
    printf("sizeof B: %d\n", sizeof(B));// >> sizeof B: 5
    return 0;
}
バイナリでファイルを読み込むときに、使えそうなテクだ。
参考サイト

0 件のコメント:

コメントを投稿