移植性のあるCプログラミング

C言語を使って移植性の高いプログラミングを行うのは簡単ではありません。このブログでは、筆者自身の備忘録を兼ねて、移植性のあるプログラミングのノウハウを記録していきたいと思います。
<< June 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
 
PROFILE
RECOMMEND
Cプログラミング診断室―さらに美しく健康的なプログラムのために
Cプログラミング診断室―さらに美しく健康的なプログラムのために (JUGEMレビュー »)
藤原 博文
私がある程度C言語でプログラミングができるようになった頃、この本の旧版を読みました。
非常に辛口の内容であり、読者によっては嫌悪感を抱く方もおられるかもしれませんが、「Cプログラミング診断室」は、C言語に関する数少ない有益な書籍のひとつです。もっとも、元の内容がかなり古いため、今となってはやや時代遅れとなった部分もあります。しかし、それを差し引いても、十分に読む価値のある一冊です。
RECOMMEND
新ANSI C言語辞典
新ANSI C言語辞典 (JUGEMレビュー »)
平林 雅英
まだC言語を覚えたてだった頃、この本の前の版である「ANSI C言語辞典」がボロボロになるまで活用しました。私が購入したC言語関連の書籍の中では、最もコストパフォーマンスが高かったと思います。
あまりにもボロボロになったので、改訂版にあたる、この「新ANSI C言語辞典」を購入しました。旧版を最初に手にしてから10年以上経ちますが、今なお手放すことができない必携の一冊です。
ARCHIVES
RECENT COMMENT
RECENT TRACKBACK
MOBILE
qrcode

無料ブログ作成サービス JUGEM
 
スポンサーサイト

一定期間更新がないため広告を表示しています


- | | - | -
構造体メンバの配置
移植性に関する話題としては、FAQに近いものとして、構造体メンバの配置に関するものがあります。つまり、構造体の最初のメンバのアドレスと、構造体全体の先頭アドレスが一致するのかどうかということと、構造体メンバの順序は保証されるのか、ということです。

これについては、標準規格を紐解けば、すぐに事実関係が明らかになります。JIS X3010:2003 6.7.2.1 構造体指定子及び共用体指定子 がそれにあたります。該当部分を引用すると、

 構造体オブジェクト内では, 非ビットフィールドメンバ及びビットフィールドが置かれる単位は, 宣言された順に増加するアドレスをもつ。構造体オブジェクトへのポインタは, 適切に変換すれば, その先頭メンバ(又はビットフィールドならば, それが置かれた単位)を指す。さらに, その逆も成り立つ。構造体オブジェクトの中に名前のない詰め物があってもよいが, 先頭には名前のない詰め物があってはならない。

となっています。
つまり、構造体の最初のメンバのアドレスと、構造体全体の先頭アドレスは一致しますし、構造体メンバは記述された順に並んでいることが規格上保証されています。ただし、ビットフィールドの場合は、各メンバではなく、ビットフィールドが置かれる単位についてですので、注意が必要です。

と、まあ、ここまでは建前です。数ある処理系の中には、独自拡張(というより非標準仕様)によって、境界調整に応じて、メンバを適切に入れ替えることで、構造体のサイズの縮小を図るものがあります。これは、いわゆるパッキングとは異なります。パッキングは境界調整を無視して、すべてバイト境界やハーフワード等に配置するわけですが、上述のものはメンバの入れ替えによって名前のない詰め物をなくそうとしているわけです。

このような仕様を持つ処理系では、通常、#pragma指令を使うか、コンパイルオプションでこのような機能を有効にします。#pragma指令の場合は使わなければ済むのですが、コンパイルオプションの場合は厄介です。つまり、(非標準処理系まで含めた)高い移植性を持たせるには、構造体メンバの配置に依存するコードは書かない方が無難そうです。

スポンサーサイト

- | 22:38 | - | -
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://portable-c.jugem.jp/trackback/17