09/03/05 09:18:13
>>81
各項目での自分的評価だと、こんな感じです(1が最も短い・速い・わかりやすい・etc):
cast: 3321
標準的な記法で、外部知識を要しない。オブジェクトサイズも最小。ただ、キャストの嵐が目に
やさしくない(マクロで対処は可能)のとオフセット計算が間違えやすい。パックされた構造の把握は
縦に読む必要がある。縦の行数はパック対象変数分程度。バッファコピーが必要になるとmemcpyが必要。
例: *(uint32_t *)(dst + 4) = (uint32_t)htonl(src); <- これがN行続く
memcpy: 4211
標準関数なので、外部知識を要さず、サイズも呼び出しのみで小さい。キャストも不要。
オフセット計算は必要で、転送データ構造のイメージは縦に読んで把握する必要がある。
縦の行数は最大で対象変数の数+エンディアン変換数程度で最大。
例: src = htonl(src); memcpy(dst + 4, &src, sizeof(src)); <- これがN行続く
struct: 2222
外部知識は要しないが、一般性で劣る。サイズはキャスト方式と同等か、スタック消費分劣る。
オフセット計算が不要で、構造イメージは横に並んだ順そのままで把握はしやすい。しかし、
構造定義が長くなりがちで、変数の使用位置から離れるとズレやすいかも。バッファコピーが必要に
なるとmemcpyが必要。
例: struct { uint32_t _a; uint8_t _b, ... } buf = { htonl(src1), htonl(src2), ... }; <- スタック利用
or typedef struct { uint32_t _a; uint8_t _b, ... } in_t;
*(int_t *)(buf + 4) = { htonl(src1), htonl(src2), ... }; <- 既存バッファへの書き込み
mprintf: 1113
フォーマット表記の知識を得る必要があるが、処理部分のコードはかなり簡潔にデータ構造を
表現・理解できる。ただし、mprintfの実装分、メモリと処理速度で劣る。処理の中身はmemcpy。
例: mprintf(buf + 4, "NN...", src1, src2, ...);