- C++相談室 part128 [無断転載禁止]©2ch.net
517 :デフォルトの名無しさん[]:2016/12/13(火) 01:47:50.23 ID:3XO5JWcw - ちなみに俺(ID:wAsQV1H6)の見解は >>454 に書いてる。
出典はデータメンバーの順序しか示せないけど(それも面倒だからやりたくない)、納得いく間違いという説明があればごめんなさいするよ。
|
- C++相談室 part128 [無断転載禁止]©2ch.net
519 :デフォルトの名無しさん[]:2016/12/13(火) 06:15:11.71 ID:3XO5JWcw - >>518
うーん。連続するかどうかしか話題になってなかったから 元々の話が union{ struct {float x,y,z;}; float elem[3]; }; てな感じの定義になっててそれがズレる的な話なのかと思ってたけど、 発端の >>428 から読み返したら違うみたいね。 それでも >>518 の言うマズいが具体的に何がマズいのかは解らないな。メモリレイアウトは配列と同じになるけど配列アクセスするとマズい理由。 428のような書き方はしないけど、struct vec3{float x,y,z;}; 的なレイアウトのクラスの配列の先頭ポインタをOpenGLの頂点配列に渡したり普通にするよね。
|
- C++相談室 part128 [無断転載禁止]©2ch.net
525 :デフォルトの名無しさん[]:2016/12/13(火) 07:52:37.70 ID:3XO5JWcw - >>523
その理屈だと昔ながらのCのmemsetとか標準機能で実装できなくない?
|
- C++相談室 part128 [無断転載禁止]©2ch.net
531 :デフォルトの名無しさん[]:2016/12/13(火) 11:40:12.26 ID:3XO5JWcw - >>530
それで、char*の場合は配列外参照についても特別扱いって事? URLの先の記事の例だとintの配列ではなくcharの配列だったら同じように最適化されないと?
|
- C++相談室 part128 [無断転載禁止]©2ch.net
533 :デフォルトの名無しさん[]:2016/12/13(火) 12:14:32.65 ID:3XO5JWcw - >>532
ん?そのURLの先のには オブジェクトTはN個のunsigned charのシーケンスとして表現できる。Nはsizeof(T)と等しい って書いてるから少なくともunsigned charのポインタとしてオブジェクトの範囲内を操作出来るって事じゃないの? 曖昧と言ってるのはそのシーケンスを配列のように扱っていいのかどうか。 つまりunsigned charについては特別扱いされてそうだけど、 帰ったら規格読んでみるかな…
|
- C++相談室 part128 [無断転載禁止]©2ch.net
535 :デフォルトの名無しさん[]:2016/12/13(火) 12:42:22.36 ID:3XO5JWcw - まぁでもわざわざ怪しい所に足を突っ込まなくても同じ領域を別の型で解釈するunionという明確な機能があるんだからそれを使うべきだよな。
発端を読み間違えていたとはいえ >>454 は良くないレスでした。ごめんなさい。 データメンバーを配列としても扱いたいなら手抜きせずunionを使いましょう。 少なくとも俺はそうしてます。
|
- C++相談室 part128 [無断転載禁止]©2ch.net
538 :デフォルトの名無しさん[]:2016/12/13(火) 13:54:57.03 ID:3XO5JWcw - >>537
その話をしてるつもりはなかったかな。 俺はsizeof(float[3])==sizeof(vec3)であること前提で話してたから。 そこは規格の話ではなく環境の話でそんな環境存在しないから考慮する意味ないよねって事
|
- C++相談室 part128 [無断転載禁止]©2ch.net
539 :デフォルトの名無しさん[]:2016/12/13(火) 13:56:42.26 ID:3XO5JWcw - もちろん無意味にメモリを3倍消費するような実装は目に入ってません
|
- C++相談室 part128 [無断転載禁止]©2ch.net
544 :デフォルトの名無しさん[]:2016/12/13(火) 20:36:46.77 ID:3XO5JWcw - >>454 にツッコミが入ったからそれについて話してただけだけど?
|
- C++相談室 part128 [無断転載禁止]©2ch.net
548 :デフォルトの名無しさん[]:2016/12/13(火) 21:08:33.14 ID:3XO5JWcw - unionで一致しない可能性を挙げるなら
struct vec3{float x,y,z;}; sizeof(float[3])==sizeof(vec3) にならない可能性がある合理的な理由、もしくは現時点で実在する処理系をあげてもらわないと。 >>454 で俺はそんな処理系存在しないだろうから考慮する必要ないと述べた、いや、ある!というならその理由を述べてくれってだけの話だよ。 規格で許されてるんだからアラインメントも関係なく間にパディング入れるコンパイラが今後出現するかもしれない、と理由もなくフワッとした感じで主張するなら、 そんな扱いづらいコンパイラを使う日が来ないことを祈るよとしか言えないけど
|
- C++相談室 part128 [無断転載禁止]©2ch.net
553 :デフォルトの名無しさん[]:2016/12/13(火) 21:41:05.59 ID:3XO5JWcw - >>552
だからその理由を言えよ
|
- C++相談室 part128 [無断転載禁止]©2ch.net
557 :デフォルトの名無しさん[]:2016/12/13(火) 22:19:10.87 ID:3XO5JWcw - >>556
union使って >(配列として宣言されてればサイズがわかっているのでセグメント切り替えをサボることができるように配置できる) のまさに配列として宣言してるわけだけど
|
- C++相談室 part128 [無断転載禁止]©2ch.net
558 :デフォルトの名無しさん[]:2016/12/13(火) 22:23:00.91 ID:3XO5JWcw - あと、規格に準拠したコードでmemsetのようなものを実装出来ないというようなレスに説得力がないかな。
|
- C++相談室 part128 [無断転載禁止]©2ch.net
561 :デフォルトの名無しさん[]:2016/12/13(火) 23:38:22.25 ID:3XO5JWcw - >>559
知らんけど。 その環境で標準準拠のC++が動くのか?
|
- C++相談室 part128 [無断転載禁止]©2ch.net
563 :デフォルトの名無しさん[]:2016/12/13(火) 23:44:19.32 ID:3XO5JWcw - 墓穴もなにも実際そんな環境しらんからな。
|