トップページ > プログラム > 2016年09月05日 > IQvMB0/c0

書き込み順位&時間帯一覧

3 位/129 ID中時間01234567891011121314151617181920212223Total
書き込み数0000001010000001010000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん (ワッチョイ b3dc-+jFW)
673 (ワッチョイ b3dc-+jFW)
C言語なら俺に聞け 136 [無断転載禁止]©2ch.net

書き込みレス一覧

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だとアラインメント境界をまたいでると遅くなるんじゃなかったかな。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。