2010年4月20日火曜日

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

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

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

サンプルコード
01#include <stdio.h>
02 
03struct A
04{
05    char c;
06    int i;
07};
08 
09#pragma pack(push,1)
10struct B
11{
12    char c;
13    int i;
14};
15#pragma pack(pop)
16 
17int main()
18{
19    printf("sizeof A: %d\n", sizeof(A));// >> sizeof A: 8
20    printf("sizeof B: %d\n", sizeof(B));// >> sizeof B: 5
21    return 0;
22}
バイナリでファイルを読み込むときに、使えそうなテクだ。
参考サイト

0 件のコメント:

コメントを投稿