- C言語なら俺に聞け 136 [無断転載禁止]©2ch.net
673 :デフォルトの名無しさん (ワッチョイ b3dc-+jFW)[sage]:2016/09/05(月) 06:57:25.15 ID:IQvMB0/c0 - >>666
この方法はダメじゃないかな。>>672の言う通り。 一般的にdata_t*のアラインメントは偶数か より厳しい4や8の倍数になると思うけど、 例えばrand()の結果が1になった時、sizeof(data_t) + 1 が 奇数になって、アラインメント要求から外れる場所ができる。 body[0]の割り当てサイズを安全なアラインメントに切り上げる、 規格にそった確実な方法ってあったかな。
|
- C言語なら俺に聞け 136 [無断転載禁止]©2ch.net
675 :673 (ワッチョイ b3dc-+jFW)[sage]:2016/09/05(月) 08:09:43.42 ID:IQvMB0/c0 - >>666 の場合は下のようにすればいいかな。
/* 型tのアラインメントに合うように数値nを切り上げる */ #define ALIGN_TYPE(t, n) ((((n) + sizeof(t)-1) / sizeof(t)) * sizeof(t)) size_t N=rand(); size_t data_t_unit = sizeof(data_t) + ALIGN_TYPE(data_t, N); data_t *data = malloc(data_t_unit * 10000); 擬似的な配列dataのi番目の要素を指すポインタpは data_t *p = (data_t*) (((char*)data) + i * data_t_unit); コンパイルして試したわけじゃないのでコピーしても動かないかも。 「dataをchar *にキャストして掛け算で位置を割り出す」という 考え方自体は >>666 の通りだね。
|
- C言語なら俺に聞け 136 [無断転載禁止]©2ch.net
684 :デフォルトの名無しさん (ワッチョイ b3dc-+jFW)[sage]:2016/09/05(月) 15:12:25.01 ID:IQvMB0/c0 - getopt.hを使わずに、オプション指定できるコマンドを何個か作ってみ。
そうすりゃgetopt()がどれだけ便利か身に染みて分かる。 と言うか、オプション処理の定型を知らないと使い方を理解しにくいね。
|
- C言語なら俺に聞け 136 [無断転載禁止]©2ch.net
687 :デフォルトの名無しさん (ワッチョイ b3dc-+jFW)[sage]:2016/09/05(月) 17:17:10.14 ID:IQvMB0/c0 - >>685
おおっと、C11以降は _Alignof() が使えるのだな。不勉強であった。 そう言うことなら >>675 のマクロは古い規格での便法。それに加えて 「sizeof()で得られる値は必ずその型のアラインメントの倍数になる」 という、確実とは言えない仮定の上に成り立ってるね。 さらに、可変長部メンバ以外の容量が大きい構造体だと無駄も多くなるな。 >>678 確かに俺の環境でも、intの値が奇数番地に格納されるようにしても動いた。 でも >>680 の言う通り、格納番地によって動かないってCPUもある。 あと86系CPUだとアラインメント境界をまたいでると遅くなるんじゃなかったかな。
|