delta-keeperの日記: ソケット通信に関する昔からの疑問 2
日記 by
delta-keeper
I2CとかSPI周りのドライバや、ソケット通信なんかのコードでパケットフォーマットを構造体に入れて扱う人はたくさん居ると思います。
だが、いつも不思議なのは「構造体パディングを考慮して、アライメント揃えたフォーマットにしろ!」という輩が、どのプロジェクトにも一人は混じっている点。
僕の担当してた案件ではまずそんなコードは書かず、#pragma pack(1)とかで設計に合わせ込むようにしていたんだけど・・・
こういうオサーンはなんで機種依存にするようなコードを書きたがるのか、と常々疑問に思ってた。
お前の環境はx64でもx86でもARMでもSHでもH8でもパディングは一緒なのか?
そしてコンパイラに#pragma packがないのか?
徹底的に議論したいと、いつも思ってます。
アライメントが揃ってないとCPUによっては遅くなるから (スコア:1)
アライメントが揃ってないとダメってのが、構造体パディング云々になってるのですかね。
その辺良く分かって無くてそう言ってるのかしら。
ドライバ書くような方には釈迦に説法のような気もしますが。
アライメントに関しては確かに環境依存なんですが、CPUによっては揃ってないと大変なんですよね。
そしてコンパイラに#pragma packがないのか?
有っても意図したとおりに機能するかや余計なコストが発生するかはまた別の話ですし。
ハードウェアやコンパイラやAPIのドキュメント参照しておかないとハマる可能性が。
http://www.kumikomi.net/archives/2008/05/08hard2.php [kumikomi.net]
APIがアライメントを要求(今時は非シングルコアなので該当)
https://docs.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-inte... [microsoft.com]
とはいえ、その辺含めて設計段階で良きに計らってるとは思いますが。
相手の都合でエンディアンがひっくり返ってるとか良く有る話でしょうし。
Re:アライメントが揃ってないとCPUによっては遅くなるから (スコア:1)
> アライメントが揃ってないとダメってのが、構造体パディング云々になってるのですかね。
これを壊れたラジオのように言い続けている仕様決定者がいるので、頭を抱えている次第ですね、ハイ・・・
ソースコードを仕様に整合するのか、はたまた仕様をソースコードに整合するのか・・・
「一般的」というのを言い出すとキリが無いですが、出来るだけ機種依存な造りはしないで欲しいと思ってます。
# ちなみに199x年頃のH8ですら、packプラグマをサポートしてます