アライメント問題
2001-07-12-3
[Programming]
とあるCプログラムがある。構造体のメンバをポインタ+オフセットで扱っ
ている。メンバ間のパディングは 0 バイトであると仮定している。この
ようなプログラムを、現状(パディング 0) を維持したまま gcc (Linux)
でコンパイルするにはどうしたらよいのだろうか?
マニュアル、info、Web を調べた結果、gcc で構造体のパディングを制御
する方法は、"__atrribute__" を用いる方法と "#pragma" を用いる方法
があることが分かった (コマンドラインオプションでなんとかする方法が
あればいいんだけどなあ)。以下にサンプルを示す。
ている。しかし、常に正しい解決方法が求められているとは限らないのだ。
それが人生だ。はがゆいものである。
アライメントの問題に関してはこちらを参照。
http://www.kab-studio.com/Programing/Dictionary/Words.html#Alignment
([2001-07-13] により適切な解あり)
ている。メンバ間のパディングは 0 バイトであると仮定している。この
ようなプログラムを、現状(パディング 0) を維持したまま gcc (Linux)
でコンパイルするにはどうしたらよいのだろうか?
マニュアル、info、Web を調べた結果、gcc で構造体のパディングを制御
する方法は、"__atrribute__" を用いる方法と "#pragma" を用いる方法
があることが分かった (コマンドラインオプションでなんとかする方法が
あればいいんだけどなあ)。以下にサンプルを示す。
サンプルプログラム
struct aa { char a; int b; };
struct bb { char a; int b __attribute__((packed)); };
#pragma pack(1)
struct cc { char a; int b; };
int main(int argc, char *argv[]) {
printf("%d %d %d\n",
sizeof(struct aa), sizeof(struct bb), sizeof(struct cc));
}
出力結果もちろん、構造体の扱いを改めるのが正しい解決方法であることは分かっ
% gcc test.c
% a.out
8 5 5
ている。しかし、常に正しい解決方法が求められているとは限らないのだ。
それが人生だ。はがゆいものである。
アライメントの問題に関してはこちらを参照。
http://www.kab-studio.com/Programing/Dictionary/Words.html#Alignment
([2001-07-13] により適切な解あり)
この記事に言及しているこのブログ内の記事