1 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:11:34.01 ID:nc/5PI4P0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part131 mevius.2ch.net/test/read.cgi/tech/1501295308/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
577 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:01:59.33 ID:qx0Cuc+s0.net] 頭おかしい
578 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:12:16.05 ID:NuT5AKLg0.net] なんかおかしな雰囲気を出してるね
579 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:18:07.19 ID:ybMjRTfR0.net] >>569 std::string はデストラクタで自動でメモリ解放するよ。
580 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:20:22.00 ID:tT1WP+x8r.net] auto f() { struct { char a[256]; } r{};
581 名前:return r; } int main (){ auto[array] = f(); } ちょっとスタックが厳しそうだ [] [ここ壊れてます]
582 名前:デフォルトの名無しさん [2017/11/11(土) 18:43:22.06 ID:35XI65Ti0.net] >>569 本当のバカはその一つすらまともに知りませんでした
583 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 19:32:54.25 ID:a9mrqTdG0.net] 今どきstd::stringを批判してcharの配列の優位性を説くとか
584 名前:デフォルトの名無しさん [2017/11/11(土) 19:56:58.42 ID:Hv/PaJUT0.net] string_viewとか持ち出して言うならともかく
585 名前:デフォルトの名無しさん [2017/11/11(土) 20:40:48.77 ID:35XI65Ti0.net] >>575 全く批判になってないから。 string_viewも今回のような用途に使うもんじゃない
586 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 21:23:35.64 ID:u9h6IsulM.net] テンプレートって基本ヘッダファイルに書くと思うけど、コンパイル単位ごとに全部コードのコピーが作成されるの?
587 名前:デフォルトの名無しさん [2017/11/11(土) 21:25:00.09 ID:Hv/PaJUT0.net] >>577 string_viewって何か知らないのか?
588 名前:デフォルトの名無しさん [2017/11/11(土) 21:41:30.08 ID:4HyMUlDc0.net] そこでmoveですよ。
589 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 21:45:04.19 ID:ybMjRTfR0.net] >>578 規格は生成コードまで規定しないから、気になるならアセンブリとか見るのがいい。 関数テンプレートあたりだとコンパイル単位またいでも同じポインタが得られることが要求されていたりはする。
590 名前:デフォルトの名無しさん [2017/11/11(土) 22:32:22.44 ID:35XI65Ti0.net] >>579 今回の件にstring_view使ってみなよ
591 名前:デフォルトの名無しさん [2017/11/11(土) 22:37:09.49 ID:35XI65Ti0.net] もしかして string_viewとか(無理やり)持ち出して(バッファーを解放しないと)言うならともかく という意味か? そうだったらそこまでエスパーにはなれんかったわ
592 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 22:42:02.84 ID:aJZfBE3c0.net] みじゅくもの
593 名前:デフォルトの名無しさん [2017/11/12(日) 05:09:14.57 ID:yBBP+7vl0.net] >>583 何か勘違いしているか? 俺は生配列を使いたがるガイキチたちを擁護したいわけじゃないし もちろん意見が一致していない C++スレなのにC++のライブラリを食わず嫌いしてるフシのあるやつに ちょっと話題を振ってみただけだ
594 名前:デフォルトの名無しさん [2017/11/12(日) 05:12:35.53 ID:srpvXSqe0.net] エスパー通訳頼む
595 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 05:23:52.17 ID:nuCi4dlE0.net] ストリングビューはストレージを保持しないぞ。 外部からやってきたやつに操作を与えるだけ。 パペットっていうかなんていうか。
596 名前:デフォルトの名無しさん [2017/11/12(日) 05:33:48.19 ID:srpvXSqe0.net] >>587 誰もそんな事は聞いてないんだけど
597 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 07:18:14.98 ID:nuCi4dlE0.net] そっか、当たり前すぎたな。
598 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 07:30:16.55 ID:/72Ra87B0.net] 頭でっかちなアスペ池沼多過ぎか
599 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:13:37.80 ID:SrvHRpLe0.net] std::stringは有用だがstd::XXXstream系は糞杉 →必然的にsptintf_s()とstd::stringを併用するスタイルになる いずれワカル
600 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:22:45.23 ID:SrvHRpLe0.net] および有用だからといってプログラムの動作根拠を成す 数量的関係の把握をサボるというのは話が違う std::stringにメモリが許す限りいくらでも長い文字列を格納できるから大丈夫とか、 スマポを使っとけばいつか(10万年後かもしれないが)確実に開放してくれるから大丈夫という見込みだけで テストもせずに青天井なデータ処理を許すプログラムをリリースするのは 素人プログラミングに後退である ていうか現在の潤沢なメモリ搭載環境では問題の発覚が遅れる分なお悪い
601 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:32:07.61 ID:11xnBK1L0.net] 10万年後wもうお前黙っておけ
602 名前:デフォルトの名無しさん [2017/11/12(日) 08:47:13.70 ID:qGtn1GtX0.net] どんなひどいプロジェクトで仕事すれば、こんなパラノイアを発症するんだろうな
603 名前:デフォルトの名無しさん [2017/11/12(日) 09:05:22.76 ID:yBBP+7vl0.net] >>592 つーことは、おまえbad_allocをcatchせずに放置してるのか
604 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 09:15:31.43 ID:SrvHRpLe0.net] つか今気づいたが>>561 は一体何が言いたいんじゃ… ページ割り当ては論理アドレス上の領域確保に対し透過的なので >スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 >割り当てられた領域をオーバーしなければどう使っても良い >もちろんフルに使ってもヒープの圧迫にはならない の否定根拠にはなりえぬ
605 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 09:17:28.25 ID:SrvHRpLe0.net] >>595 ていうかむしろ藻前は正常系がbad_allocのcatchに依存した設計してるの?
606 名前:デフォルトの名無しさん [2017/11/12(日) 09:25:43.37 ID:yBBP+7vl0.net] >>597 なぜそう思った?
607 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 10:48:39.64 ID:MOg5phwx0.net] >>594 お前らがよってたかっていじめるからだろ w
608 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 13:20:18.65 ID:cRGoHocf0.net] まだ516の糞コードの話題やってんのか まったく飽きないフレンズどもだな セルリアンに喰われちまえよ
609 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 17:58:51.11 ID:mnWm2NGv0.net] 次は20が控えててどんどん進化してるけどmeyers本
610 名前:なしについていける自信がないよ。 17以降遭難者が続出するんじゃなかろうか。 [] [ここ壊れてます]
611 名前:デフォルトの名無しさん [2017/11/12(日) 18:04:43.84 ID:Rpn1RmMo0.net] 17ってそんなに難しいか? 14以後ってか11以後、03までのストイックを通り越したマゾプレーからの離脱が 大きなテーマになっていてautoのinitializer_listみたいなミスはしながらも ちゃんとそれを正していく自浄作用が機能していると俺は思うが
612 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 18:39:00.77 ID:1bparYl/0.net] auto_ptrとかgetsとかトライグラフとかboolの++とか 危険で無駄で混乱を招くゴミが続々取り除かれてどんどん使いやすくなってるよね 生ポインタや生配列をいじくり回してメモリ壊すこともほとんどなくなった
613 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 20:18:16.94 ID:tDIYjV/wa.net] c++の機能がこのまま進歩していったとしてマクロは消えるかな?
614 名前: mailto:sage [2017/11/12(日) 20:20:30.26 ID:Va1KoPXV0.net] テンプレートがマクロそのもの
615 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 20:33:05.49 ID:tDIYjV/wa.net] constexprとかautoのおかげでtemplateもマクロとして使いやすくなったよね。 そう考えるとテンプレートで出来なくてマクロじゃないと出来ないのって何かある?
616 名前: mailto:sage [2017/11/12(日) 20:47:50.42 ID:Va1KoPXV0.net] 多重マクロはテンプレートで置き換えられるのだろうか? お題:mevius.2ch.net/test/read.cgi/tech/1432402159/18 ベタな回答: mevius.2ch.net/test/read.cgi/tech/1432402159/106 peace.2ch.net/test/read.cgi/tech/1313183984/803 https://code.hackerearth.com/2642c4w 多重マクロによる回答 mevius.2ch.net/test/read.cgi/tech/1432402159/128 https://ideone.com/vNZWaH
617 名前:デフォルトの名無しさん [2017/11/12(日) 21:24:58.95 ID:Rpn1RmMo0.net] >>605 テンプレートとマクロの本質的な違いがわかってないな スコープに従うテンプレートやconstと ほとんど何も考えてないおまえみたいなマクロは オブジェクト指向という観点からは全く別次元なものだ
618 名前: mailto:sage [2017/11/12(日) 21:43:24.64 ID:Va1KoPXV0.net] 「ほとんどなにも考えていない」とは手厳しいですね…
619 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 21:52:12.94 ID:D2YYnuTs0.net] オブジェクトたいして指向関係ないだろ
620 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 21:52:39.76 ID:D2YYnuTs0.net] 何だこの日本語wwww オブジェクト指向たいして関係ないだろ
621 名前:デフォルトの名無しさん [2017/11/12(日) 22:01:17.81 ID:rtfRb36m0.net] マクロの乱用をさけるためにテンプレートが発達してきたんだからマクロ使わないでね
622 名前:デフォルトの名無しさん [2017/11/12(日) 22:17:39.90 ID:dvIcUwwY0.net] オブジェクト指向関たいして係ないだろ
623 名前:デフォルトの名無しさん [2017/11/12(日) 22:36:48.97 ID:H7C5gFJ50.net] >>606 文字列リテラルを、リテラルとして連結するのはマクロじゃないと無理じゃないかな。
624 名前:はちみつ餃子 mailto:sage [2017/11/12(日) 23:06:22.93 ID:HZk/rPeS0.net] >>614 不可能ではないと思うけど、そう気軽ではないというのは確かだと思う。
625 名前:デフォルトの名無しさん [2017/11/13(月) 00:53:11.35 ID:50LJDJg60.net] const char8_t[] u8hage = "hage"; // = u8"hage" const char16_t[] u16hage = "ハゲ"; // = u"ハゲ" const char32_t[] u32hage = "禿"; // = U"禿" const wchar_t[] whage = "はげ"; // = L"はげ" みたいなプレフィックス省略が出来ればいいのになって思うときがあるね
626 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 01:19:29.77 ID:eMI9MrYT0.net] >>616 Haskell だとリテラルは多相になっていて、型推論で適当な型にあてはめられるんだが……。 C++ では返却値だけ型が違う関数はオーバーロードできないルールがある。 その延長でリテラルは無引数の関数のようなものと考えると文字列リテラルが様々な型で有りうるようなのは難しいと思う。 型の情報が重複してるのがダサいと思うなら型名の方を auto で書くくらいかなぁ。
627 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 02:08:07.11 ID:Vao2bSzU0.net] kotlinとかswiftにあるiterator.forEach{}の構文がc++にもついてほしい c++だとiterator.for[=]{ }みたいな構文になるんだろうか
628 名前:デフォルトの名無しさん [2017/11/13(月) 02:48:35.71 ID:KYqigAA60.net] >>615 うーん… 文字列リテラルは無理じゃね?
629 名前:デフォルトの名無しさん [2017/11/13(月) 03:24:18.68 ID:XQ/CgY2w0.net] 言語仕様変えないと無理かな?
630 名前:デフォルトの名無しさん [2017/11/13(月) 04:17:46.93 ID:V72qpTkz0.net] >>619 コンパイル時定数という意味でのリテラルであれば出来るが
631 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 07:31:48.15 ID:zGRAb4NCa.net] templateだったら関数の返り値が異なってもokだしconstexprならコンパイル時定数だから変換さえ出来ればやれそうな気もする。 >>618 範囲for文は駄目?
632 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 07:34:39.03 ID:8qKZRJJX0.net] 範囲FORとSTLにfor_eachがある。 en.cppreference.com/w/cpp/algorithm/for_each
633 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:15:04.60 ID:JahHbsM6M.net] >>622 変数.for...って書き方がしたい
634 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:27:56.98 ID:zGRAb4NCa.net] 自作クラスならtemplate関数で範囲forを閉じ込めるとか? 試して無いけどこんな感じで class test{ //begin()とend(),++が定義されているものとする template<typename Func> void for_(Func func){ for(auto& it: *this){ func(lt); } } }
635 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:34:12.47 ID:TpgUuavl0.net] そういう臭い書き方はC++ではあまり採用されない方針 オブジェクト指向じたい、もうあまり言われてなくて テンプレートによるメタプログラミングが主体になってる オブジェクト指向を前面に押し出した言語はオワコンになるという法則があって なもんで、魔除け、キチガイ除けの意味も含めて Java や C# や C++ など、主流言語は 「マルチパラダイム言語」、「オブジェクト指向をサポート」 といった、ちょっと距離を置いた付き合いかたをしてるね きっと、「全ての手続きは必ずただ一つのオブジェクトに紐づかなくてはならない」 という強迫観念的ともいえる窮屈な考え方が脳や精神に良くなかったのだろう 本当に精神疾患を引き起こしてリタイアする人多いし
636 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:59:56.81 ID:kicNWBgmM.net] 変数forならラッパ作れば終わりだけどなんかつまらないね。 apply(op).for(sequence)とかのほうがインターフェースとしては見栄えがいいかも
637 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 10:38:35.17 ID:8qKZRJJX0.net] >>624 ユニファイドコールシンタックスっていう提案が出ていたけど、ぽしゃった。 俺もほしい。
638 名前:デフォルトの名無しさん [2017/11/13(月) 10:50:06.32 ID:4dN82Cnsd.net] 「制御構造までオブジェクトに属するべき」ってやり過ぎというより単に根拠のない主張だよね。
639 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 11:12:29.10 ID:lmnXwEnk0.net] range-based forで十分じゃん何が不満なんだ理解できない 俺が思うのはインデックス取れたらいいなあということぐらい
640 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 11:19:17.35 ID:zGRAb4NCa.net] 書いといてなんだけど624と630の意見に賛成
641 名前:デフォルトの名無しさん [2017/11/13(月) 11:43:20.37 ID:4dN82Cnsd.net] zipwith相当のことをどうやって書く?
642 名前:デフォルトの名無しさん [2017/11/13(月) 12:13:53.76 ID:uodQK+nnH.net] >>630 最終的な結果がその処理順序に影響する(ここのオブジェクトへの操作が独立していない)場合には範囲for文使うなってことじゃね? 標準で取れるようにしてる言語も中にはあるけど
643 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 12:34:55.34 ID:kicNWBgmM.net] >>628 それは全然別の機能だけどな
644 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:01:28.76 ID:3MWvQR0t0.net] >>601 meyers本ってそんなに役立つかねぇ 最初のeffective c++ちょろっと読んだ程度なので最近のは知らんけど あの人の本に従ってる人は、自分で考えて創意工夫しない人が多いよ セオリーに固執する日本人はそういうパターンに陥りがち
645 名前:デフォルトの名無しさん [2017/11/13(月) 13:13:06.32 ID:pJUCOUGu0.net] お前らの創意工夫よりメイヤーズの方が100倍信じられるから
646 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:29:22.72 ID:3MWvQR0t0.net] 自分の才能や経験の不足を虎の威で補おうとしてるのなら、終わってるよ meyersが「こうしろ」と言ってることの、理由まで含めて納得するならいいけど そうでない人の方が圧倒的に多いからなぁ >>636 がまともな実力持ってるなら、meyersが言うセオリーに当てはまらない場面なんて山ほど経験してるはずだが
647 名前:デフォルトの名無しさん [2017/11/13(月) 13:33:42.96 ID:2e8VXpGed.net] >>637 例えばどういう場面?
648 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 14:57:06.43 ID:eMI9MrYT0.net] >>635 あーいう本は典型的・基本的な工夫を示すもので、それを踏まえてその先へ行くもんなんだよな。 基本でしかないことに拘泥するのは下策でも、基本的なことすらおさえずにいるのは論外だから役には立つよ。 ある程度の経験を積んでいればああいう本に書かれているようなことは習得していて当たり前だっていう意味で 有用さに疑問を持つって意味かな?
649 名前:デフォルトの名無しさん [2017/11/13(月) 15:36:55.69 ID:pJUCOUGu0.net] ド素人の創意工夫とかマジ勘弁してほしいな セオリーもちょろっとしか知らないのに自分のコードが正しいと思い込んじゃうパターンだなこれは
650 名前:デフォルトの名無しさん [2017/11/13(月) 15:57:04.39 ID:50LJDJg60.net] まぁ公園の立て看板みたいなもんだからな
651 名前:635 mailto:sage [2017/11/13(月) 18:34:02.62 ID:Rgprs5DR0.net] >>637 >>639 手元にないので軽くぐぐってみたけど、確かに初心者が手元に置いておくべき良書だというのは否定できないw ほとんど突っ込みどころなんて無いし(当たり前の内容も含めて、”大抵のパターンで”正しい話ばかりだと思う)、 ちょっとけなしすぎたかも ただ「値を返す関数の戻り値にもconstつけよう」ってのは理解できんかったがw(古い本なのでしゃーないか?) こういうのあるから鵜呑みは良くないと思うんだよね 結局は自分の頭で考えないといかん まぁ最新の版だと変わってるかもしれんし本文がどう書かれてるかわからないので、間違ってたらスマソ
652 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:14:19.64 ID:IBZYfbeXM.net] 俺のつたない経験でも>>637 は口先だけの使えない奴だとわかる
653 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:28:15.39 ID:Rgprs5DR0.net] >>643 そっくりそのまま返すわ、どうせ教えられた通りの書き方しか出来ない無能だろ?
654 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:37:54.37 ID:jV9TFoOE0.net] >>642 呆れた。 ろくに読まずになおも否定したいのか。
655 名前:デフォルトの名無しさん [2017/11/13(月) 19:38:46.06 ID:4dN82Cnsd.net] >>640 おかしな事を言うね ど素人は好きに創意工夫すればいいんだし、そもそも自由だろ プロはプロなりのレベルで創意工夫してるんだろうし、対象層がわからん
656 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:41:58.13 ID:Rgprs5DR0.net] >>645 だいぶ昔に借りて読んだ程度のうろ覚えで否定したが >こういうのあるから鵜呑みは良くないと思うんだよね meyers本に限らず、これが間違ってると思ってんの? それとも >「値を返す関数の戻り値にもconstつけよう」 これが正しいと思ってんの?
657 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:56:42.22 ID:IBZYfbeXM.net] >>644 はいはい 口先君にはかなわないや w
658 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 20:05:51.53 ID:eMI9MrYT0.net] d2dcan0armyq93.cloudfront.net/photo/odai/400/b24797f835fc8aa55b74e76aa1a3efbe_400.jpg
659 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 20:56:07.38 ID:aYJEvERuM.net] >>647 発言を局所的に切り取ってやり玉に上げるマスゴミみたいなやつだな。 否定したいならちゃんと読んでからにしろよ。 それに世界中のc++erに査読されて正誤表も常に更新されている本に>>647 が突っ込めるようなことは書いてないから。 後、c++11以降はmodern effectiveのほうだから間違えないようにね。
660 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 20:59:24.41 ID:8bmF3HL10.net] >>637 が正しいなら「meyersが言うセオリーに当てはまらない場面」で使うべきセオリーを解説した書籍があって然るべきだが そのセオリーを持っているのは世界中で>>637 一人だけらしい
661 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:14:54.89 ID:Rgprs5DR0.net] >それに世界中のc++erに査読されて正誤表も常に更新されている本に>>647 が突っ込めるようなことは書いてないから。 それ言い出すとmeyers本以外もそうだよね >自分の才能や経験の不足を虎の威で補おうとしてる と言ったのがよっぽど図星だったのか? >「meyersが言うセオリーに当てはまらない場面」で使うべきセオリーを解説した書籍があって然るべき 何言ってんだこいつ・・・・
662 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:16:31.80 ID:Rgprs5DR0.net] 上級者ぶったド素人が煽ってくることが最近多いんだよな・・・・沸かせてしまったようでスマン
663 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:29:07.66 ID:gczEvEcT0.net] > 上級者ぶったド素人 笑うところなんだろうか...
664 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:38:07.19 ID:ai0URxg+0.net] 何の役にも立たないことしか言えないマウンティング野郎なんて放って置けよ 俺も最近C++使う頻度が落ちてきてるので最新の規格について行くのがつらい おすすめの本を紹介してくれよ
665 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 23:12:57.95 ID:Rgprs5DR0.net] あ、一つ看過できない文があったので突っ込んどく >>650 >発言を局所的に切り取ってやり玉に上げるマスゴミみたいなやつだな。 >>647 で切り取ったのは全て俺のレスなんだが・・・バカじゃないの
666 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 23:44:05.34 ID:VhEXZUqOM.net] 愚者は経験に学ぶとはよく言ったものだ。
667 名前:はちみつ餃子 mailto:sage [2017/11/14(火) 01:12:42.81 ID:sf3KY8eH0.net] >>646 プロであるということとド素人であるということが両立することもあるのが業界の闇ってやつだ。
668 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 01:26:10.22 ID:pNE3yOyS0.net] プロってプロフェッショナルの略なんでしょう? 意味は専門家、本職 素人とは その事に経験が浅く、未熟な人。 その道で必要な技能や知識をもっていない人。ま た、その事を職業・専門としていない人。 両立はかなり困難。 プロになりすます素人なら有るかもしれないが、ちょっと意味が違うよね。
669 名前:デフォルトの名無しさん [2017/11/14(火) 05:32:45.44 ID:Qlty8abH0.net] 両立つーかさ、誤解されるんだよね 俺も時々ご近所のオバチャンに パソコンのプロなんだと勘違いされる 俺はPCに関しては完全にお客さんなんだが
670 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:51:17.15 ID:FlTFFitRM.net] >>659 その道で生計たててるド素人ってことだろ
671 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:54:42.56 ID:tdyDp5gr0.net] 人に教示して何らかの成果を与えられるレベルの人間を人はその道のプロと呼ぶ
672 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:59:19.15 ID:DJh/5L380.net] 人に教示なんてプロのあり方の一つでしかないだろ
673 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 07:49:46.74 ID:+V+yUas7M.net] >>546 これって皆さんどう考えてますか? うちのプロジェクトでは規約で スタック領域は基本16KB未満、 例外で許容出来るのは1.8MBまで、 オートは厳禁と決まっているので 気にしたことなかったです
674 名前:デフォルトの名無しさん [2017/11/14(火) 07:57:32.24 ID:WJGjqzt8d.net] >>664 >オートは厳禁 こっちの方が気になるんだが
675 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 08:14:14.12 ID:+V+yUas7M.net] >>665 auto変数じゃないです allocaのことです
676 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 09:42:20.00 ID:kNpqefN60.net] なんだ、無能が暴れてたのか 参加できなくて残念だ
677 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:27:34.86 ID:RoZqoRkM0.net] >>667 =>>626 あんなアホな長文書けるやつに無能とか言われたくないわw 今はメタプログラミングが主流かーそうかー あと、かつてオブジェクト指向を最も全面に押し出してたのがJavaだったんだけどね ついでに>>650 =>>657 ID変えてまでご苦労さん
678 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:52:46.80 ID:Dc+h7CROM.net] >>664 組み込みなら別に珍しくない ってか関数単位の制限なら結構緩いと思う
679 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 14:51:11.71 ID:kNpqefN60.net] 言うなれば、そうだね いい年越えたおっさんが、子供を笑ってるのがあまりに滑稽だったから 逆に笑いものにされてる、と言ったところか あと、自分の発言の都合の良い部分だけ切り抜いて押し通そうとする幼稚な戦法が 通じると思っているあたり、随分な思い上がりだな
680 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:02:26.05 ID:kNpqefN60.net] ああ > 都合の良い部分だけ切り抜いて押し通そうとする幼稚な戦法 は君の言う「自分で考えて創意工夫」の結果なのかな? こーゆーのが透けて見えるから愚者と言われるんだろうな 気を付けたほうが良いよ
681 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:16:47.23 ID:y8IxqJhx0.net] 次スレからスレタイトルを人生相談室にしよう
682 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:29:24.63 ID:RoZqoRkM0.net] >いい年越えた こいた、な メタプログラミングが主流、の説明してもらえる? 出来ないのなら、煽るしか能のない荒らしだと自覚した方がいいよ C以来のテクニックやC++でのOOPなどの昔ながらの技術はもう出尽くしてるから そういう誤解する初心者が多いんだろうけど・・・・まともにメタプログラミングやったことあれば それが主流だなどと豪語できないよ
683 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 16:21:46.02 ID:kNpqefN60.net] それは君が文章やスレの流れを全く読めないというだけ > メタプログラミングが主流、の説明してもらえる? まさに一部だけ抜き出してマスコミ云々だな それで一部だけ抜き出して自分のフィールドに持ってきて ゴチャゴチャ言うのが君の創意工夫なのか?通用しねーよ >C以来のテクニックやC++でのOOPなどの昔ながらの技術はもう出尽くしてるから >そういう誤解する初心者が多いんだろうけど・・・・ >まともにメタプログラミングやったことあれば >それが主流だなどと豪語できないよ ↑全体的に攻撃先がズレてて的外れ >>618 を読めば分かるが、「次期」C++に入ってほしい、というような内容 で、OOにこれ以上施すことはあまりないので、C++標準化委員は OOよりメタプログラミングを主体に策定している (から、今更OOっぽい書き方は入らないんじゃね?)と言ってるまで
684 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 16:36:44.71 ID:RoZqoRkM0.net] ああ、そういう流れだったか、そこは誤解してたようだスマン ただし>>626 の4行目以降、全部お前の願望だと思うがw >まさに一部だけ抜き出してマスコミ云々だな >それで一部だけ抜き出して自分のフィールドに持ってきて >ゴチャゴチャ言うのが君の創意工夫なのか?通用しねーよ うん、しつこいよ というか>>656 でその煽りが不適当だと指摘してるんだが本人謝りもしねーし そういう悪意ある煽り文(しかも他人の文に乗っかって)を自分で読んでどう思う? 俺がこういうキツイ書き方してる相手は全部煽ってきた相手だけなんだが >C++標準化委員はOOよりメタプログラミングを主体に策定している 11, 14, 17, 20の新機能見ても、そうは思えない 自分の願望をさも事実かのように書くのはいかんよ >>618 的な書き方が入ると思う、というわけではないけど
685 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:44:34.35 ID:kNpqefN60.net] 自分の発言だろうが、他人の発言だろうが 都合のいいところだけを切り取って流れを無視するのは マスゴミ的って話だろ、そういう余計で姑息な工夫は要らないし その意味で「お前の創意工夫は要らない」って笑われてるんだろ 誘導尋問じゃねーんだよ > >C++標準化委員はOOよりメタプログラミングを主体に策定している > 11, 14, 17, 20の新機能見ても、そうは思えない あ、っそ
686 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:54:08.40 ID:5jBDp5KP0.net] 新機能の話をしていると初心者はさもそれが当たり前に使えなければならないように感じるがそんなことはない。 俺C++でクラスを自作することかなり少ないし。関数だけでもプログラミングはできる。 constexprも入ってやりやすくなったしな。そしてそれを全部内包するのがC++だ。
687 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 18:09:19.85 ID:kNpqefN60.net] 朱に交われば赤くなるって諺もあるしなぁ 初めからウンコを触るつもりで取り扱ってないと危険なのかも 思考が染まると、それを通して周りを見るので ヒントが沢山あっても正しく捉えられなくて なかなか抜け出せないのかもしれない それか、初めから頭がおかしかったパターンもあるかも どっぷりな人はそっちかも 黎明期は集団で流れることがあるからなぁ (なにせ悪は甘美) 学生運動とかいう今考えると理解しがたいのが流行ったり 大人側が組み入れながら徐々に脱却って感じかね
688 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 18:09:36.71 ID:RoZqoRkM0.net] >>676 うわ、話にならんわこいつ・・・ >>677 荒れさせておいて同意するのも申し訳ないけど、俺もそうとしか思えない D&E読んでも、C++がマルチパラダイムを自称するのはそういうことだし 「知らないことがその人を不幸にしない」とかゼロオーバーヘッドの話はまさに>>677 に合致する 最近C++を勘違いしてるヤツがデカイ口叩きすぎだわ そういうのはごく一部で、大抵無視されてるんだろうけど、C++を学ぼうという初心者が減ったら迷惑なんだけどな・・・・ 荒れさせてスマソ、バカが調子に乗ってるのでこの辺にしとく
689 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 19:35:24.74 ID:0CBPSjnu0.net] C++ってクラスとかテンプレート使うのがパチッとくる 場合はいいけれど、難しいで。 過去のCのプログラムとかC++のクラス使って書き直そうとすると。 実力なしでゴメソ。
690 名前:デフォルトの名無しさん [2017/11/14(火) 19:36:24.31 ID:WJGjqzt8d.net] OOに関してはひところ純粋主義者が極端な言説を展開してC++をdisる流れがあったから、 それに対する反発と恨みがあるんだろうよ
691 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 19:45:52.27 ID:0CBPSjnu0.net] >>681 俺もC++でOOのなんたるか理解しようとして心が折れそうになった。 肩身せまそうにbetter Cとしか使ってませんとか。 今ならrubyとか極端な話、powershellのコマンドいじくって た方がわかりやすい。隠ぺいか(カプセル化)も 中身が細かく知りたいときには、イーッってなるし。
692 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 20:21:53.24 ID:kNpqefN60.net] なんだかんだ、OOはオプションのうちの一つ というありきたりの結論
693 名前: mailto:sage [2017/11/14(火) 20:47:09.33 ID:l3LpPi1S0.net] >>682 カプセル化は、アクセス・窓口を制限・整理する、という目的だとおもいます >>677 >新機能の話をしていると初心者はさもそれが当たり前に使えなければならないように感じるがそんなことはない。 じゃ、ムーブセマンティクスも忘れちゃっていいですか、RVO に頼るだけでいいですか?え?だめ?やっぱりやらなきゃだめですか
694 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 20:54:58.60 ID:5jBDp5KP0.net] >>684 最適化するんなら必須か知らんけど、あるていどはコンパイラさんに投げてもよいのでは?
695 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 21:53:29.73 ID:Dc+h7CROM.net] もうなんの話をしてるのかよくわからんけど >>637 > >>636 がまともな実力持ってるなら、meyersが言うセオリーに当てはまらない場面なんて山ほど経験してるはずだが の具体的な場面だけは教えて欲しいわ
696 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 22:17:43.84 ID:0CBPSjnu0.net] >>684 >カプセル化は、アクセス・窓口を制限・整理する、という目的だとおもいます (データ+アクセス専用関数)=クラスだろ
697 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 23:16:12.96 ID:kNpqefN60.net] OO用語の定義に関して、何か始まりそうな感じだが もう何十回と繰り返されたか、初心者的にはまだまだやり足りないのかもしれないが 老婆心ながら言わせていただくと、OO用語の定義談義合戦は過去幾度となく繰り返されたが 特に意味はなかったから止めておいたほうが良いよ OO自体、まじめに考えてもあんま意味ないっつーか、むしろまじめに考えるとドツボっつーか 一見正しいけど、本質的には意味が無いことってあるじゃん ある視点で見れば正しいんだろうけど、そういうことじゃないっていう どうしてもやりたいなら止めないけど
698 名前:デフォルトの名無しさん [2017/11/14(火) 23:25:41.26 ID:WJGjqzt8d.net] 定義がないんだから議論の正しさの検証も測定もできないしね
699 名前:デフォルトの名無しさん [2017/11/14(火) 23:47:17.80 ID:A1uj0brl0.net] 測定機ならAliexpressでいろいろ売ってるよ。
700 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 04:07:06.94 ID:EEpCgCZL0.net] C++のクラスなんて便利な構造体以上の何者でもない OO宗教でそれ以上の縛りを入れる必要なんてないわ
701 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 04:43:25.86 ID:oRL+59ym0.net] C++の書式がどーの新機能がどーのってプログラマーが、楽になる機能なわけで、本質は、楽してコードが動けばいい。 学術的だとどーでもいい。議論するだけ無駄。 コンパイラは、速くて、安全なアセンブリコードを吐いてくれればいいよ。
702 名前:デフォルトの名無しさん [2017/11/15(水) 05:57:24.70 ID:1fEpam2j0.net] 禿もそういう系の揉め方を防ぐように気を使っているらしいな なんだっけ、どの分野の人々をも侮辱しないとか 全てが1つのクラスから派生しなければならないというのは押しつけがましいとか
703 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 13:52:35.02 ID:qOFIR485M.net] 数値の比較をしていってある一定の差があるところを区切っていきたいです たとえば{1,4,7,8,11}って値を先頭から見て行って差が2以上あるところ{1}{4}{7,8}{11}のような感じで区切る どうすれば実現できるでしょうか
704 名前:デフォルトの名無しさん [2017/11/15(水) 14:31:02.26 ID:l7NNgtZ+d.net] >>694 「区切る」の定義をしてくれ 入力が文字列じゃなくて数値ってことは、間に区切り文字を挟むとかそういうことじゃないんだろう。
705 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 14:34:11.09 ID:ckRbh5hb0.net] 後ろから前を引いて2以下?なら前を前回と同じバッファにプッシュバック。的な感じ。
706 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 14:55:59.73 ID:qOFIR485M.net] >>695 後々区切られたまとまり毎に操作したいので できればまとまり毎にそれぞれ別の変数に入れたいです ただ操作上絶対に有り得ない数値を区切り文字として使うのでも良いです {1}{9999}{4}{9999}{7,8}{9999}{11}{9999} みたいな形で
707 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 15:10:16.47 ID:mxK8zV000.net] こりゃまた大物新人が来ましたね
708 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 15:49:08.40 ID:hv/Fx57R0.net] >>694 の書き出し化けてない? 「??白lの比較をしていって…」と表示されるんだけど。 対象の {1,4,7,8,11} はconstの整数のvectorへの参照で受け取るとして、 結果は要素グループごとに格納したvectorのvectorで返すかな。 各グループの先頭要素へのインデクスを格納したvectorで返すかも。 >>697 を見ると、前者の方が後の使い勝手が良いのかな。 要素グループのvectorのvectorってこと。
709 名前:デフォルトの名無しさん [2017/11/15(水) 16:08:47.13 ID:l7NNgtZ+d.net] 俺の知らない言語の話だったか...
710 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:15:16.93 ID:SXIXTuPm0.net] 麻雀か何かのアルゴリズム?
711 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:20:55.95 ID:8IQafsadM.net] >>699 実装も前者の方が楽そうですな。 前の値と比べて差が広かったらグループ追加。
712 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:49:04.26 ID:5RHQ4qAcM.net] >>699 その部分は数値の比較と書きました 要素グループのvectorのvectorですか どのような感じで書けばいいとかどのような調べかたをすれば良いか教えて頂けないでしょうか 取っ掛かりが分からなくて
713 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:49:57.11 ID:VtRcCO4N0.net] >>697 参考までに聞きたいんだが この処理を何に使うの?
714 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:57:55.30 ID:5RHQ4qAcM.net] >>704 ある方法で手に入れた
715 名前:「くつかの数値を先頭値から見ていき、 前後で差が小さいもの同士でグループ分けしていったあと そのグループ毎の平均値を出していきたいだけです [] [ここ壊れてます]
716 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:01:28.65 ID:mxK8zV000.net] それを何に使うかって聞いてんじゃないの
717 名前:デフォルトの名無しさん [2017/11/15(水) 17:04:07.50 ID:QX/ZMY070.net] こういう泥臭いのは人に聞くよりもスクリプトでもなんでも良いから書いて試行錯誤すればいいと思うのよ
718 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:07:39.49 ID:VtRcCO4N0.net] 株価やFXの予測とかそんな感じか?
719 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:52:07.11 ID:SXjwAfn20.net] >>705 ruby2.2〜ならchunk_while/slice_whenで出来る
720 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 18:15:01.29 ID:SXjwAfn20.net] スレタイみてなかた
721 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 18:49:45.50 ID:9uMqyRhU0.net] >>705 思い付くまま書くとこうなるがもう少し短く出来そうな気もする Ideone.com - dOQm10 - Online C++ Compiler & Debugging Tool https://ideone.com/dOQm10
722 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 20:48:51.98 ID:5RHQ4qAcM.net] >>711 ありがとう参考にする しかし、よくこうスラッとプログラム書けるよなぁ 凄いわ
723 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 20:52:44.99 ID:r8JgjB1aM.net] 平均なら https://ideone.com/tZALcZ で充分と思うが
724 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 22:24:21.73 ID:KiQc4/2v0.net] 自分なりにやってみた。 https://ideone.com/ugURi1 >>711 vector::insertで領域の再確保が起こると既存のイテレータが破壊されるんで 24-25行あたりの処理はヤバイ。
725 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 22:45:07.35 ID:sivdqd190.net] >>694 書き方だけならもう少し洗練?できるだろうけど https://ideone.com/DYlMc0
726 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 19:03:07.86 ID:qgvG7lfo0.net] すれちがいだけど、 C++が出る前のC言語で、STLが必要な処理はどうしてたの?
727 名前:片山博文MZ mailto:sage [2017/11/16(木) 19:10:17.36 ID:1Qzf60whd.net] >>716 固定バッファとか、ヒープとか、自己参照構造体などで管理してたはず。
728 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 20:50:27.90 ID:WXeeSnzL0.net] >>612 ←こういう馬鹿がいるから
729 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 21:22:02.83 ID:xIkq77qW0.net] 一応つっこみ。 型の一般化がテンプレートと思うが マクロじゃなくてテンプレート使えって書いてた本もあったような 気がする。
730 名前:デフォルトの名無しさん [2017/11/16(木) 21:27:58.68 ID:w4cxkmV2d.net] >>718 新たな馬鹿の登場かな?
731 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 21:39:47.71 ID:Pxu9bZObM.net] >>716 いや自分で書けばよくね?
732 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 08:37:40.63 ID:smNh
] [ここ壊れてます]
733 名前:jLrp0.net mailto: >>716 STL 等はあれば便利なだけで「それが必要な処理」などない。 [] [ここ壊れてます]
734 名前:デフォルトの名無しさん [2017/11/17(金) 09:38:50.05 ID:S87VOpst0.net] >>716 STLで使われているアルゴリズムはC++前からあったものばっかだよ
735 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 09:46:53.51 ID:4EHSQg4KM.net] 汎用アルゴリズムのコードを業界で共通化することもなく、みんなが各々で実装してたんですか?というアンチテーゼだろ
736 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 09:59:16.63 ID:smNhjLrp0.net] 違うと思うけど?
737 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 10:03:14.26 ID:NwY4XtJI0.net] まぁ、ライブラリとして偏在はしてたんだろうけど、あの会社はあのライブラリこの会社はこのライブラリってややこしいことになってたと思う。
738 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 16:57:04.66 ID:vGXyPrNqa.net] リンクリストと平衡二分木ぐらいなら雑に書いても500行ぐらいでできる みんな大学の復習と思って書いてたんじゃないかな?
739 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 18:49:47.16 ID:a6b9gyRQd.net] 自力で書いてる人の方が多かった STLがあっても用途によっては独自になるよな ディスク上に作るとか、JPEGのハフマン符号みたいに表現が決まってる物とか
740 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 18:52:08.38 ID:a6b9gyRQd.net] STLはあくまでお手軽用途 表現縛りがなかったとしても、 ガチガチに最適化する用途では使えない
741 名前:デフォルトの名無しさん [2017/11/17(金) 20:50:18.49 ID:HNipYc2I0.net] 最適化できない? なんで?? テンプレートだろ
742 名前:デフォルトの名無しさん [2017/11/17(金) 21:51:52.32 ID:Eetf/DNi0.net] テンプレート万能説爆誕。
743 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 22:21:21.86 ID:EgKbzTW+0.net] if ( オーバーヘッドがない != 最適化される )
744 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 22:36:52.56 ID:stAFfC8Ar.net] ガチガチに最適化する状況が最近はほとんどない
745 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:08:51.45 ID:grVEZAi9M.net] ガチガチに最適化すべき場合ってどんな時だろうか
746 名前:デフォルトの名無しさん [2017/11/17(金) 23:17:53.86 ID:Eetf/DNi0.net] ガチガチの最適化が仕様に盛り込まれたとき。
747 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:46:01.61 ID:grVEZAi9M.net] そんな恒真命題は期待してないゾ 証券取引所とかか
748 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:47:03.87 ID:Xj6+FFKd0.net] プログラミング工数の最適化
749 名前:デフォルトの名無しさん [2017/11/17(金) 23:50:29.19 ID:sEHgCDk10.net] 最近は凝ったアルゴリズムより単純な配列(vector)の方が速かったりするうえに、余程古いかクソな標準ライブラリを使用してない限りstd::vectorを最適化する余地なんてほぼ無いわな。
750 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 00:03:07.23 ID:r8nC/FGp0.net] 最適化はコンパイラに任せてソースは読み易さ重視 std使っとけばデバッガでも追いやすいし
751 名前:デフォルトの名無しさん [2017/11/18(土) 00:08:41.90 ID:CUoz+hOS0.net] 拡張ライブラリが有ったとしたら、名前空間はstxになるのかね。
752 名前:デフォルトの名無しさん [2017/11/18(土) 00:11:29.34 ID:CUoz+hOS0.net] Qtでウェブサイト作ったら何の問題もなくずっと動き続けてびっくりですよ。 Javaスレの人たちがC++は稼働し続けるとメモリーの分断化で落ちるとか言ってたから、 早く書き直さなきゃって思ってたんだけど。 クライアント用のQtがサーバーで頑健だったのは意外だった。
753 名前:デフォルトの名無しさん [2017/11/18(土) 00:14:32.63 ID:asu2qdyg0.net] まぁ意識高い系が言うことなんかその程度ってこった
754 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 00:21:40.93 ID:GO3RY34O0.net] >>741 TreeFrogの人?
755 名前:デフォルトの名無しさん [2017/11/18(土) 01:10:27.30 ID:PnwIkFzo0.net] >>741 クソJavaプログラマーがC++を書くとほぼ間違いなくやるただのメモリリークを俺のせいじゃないということにしたかっただけというのに1票
756 名前:デフォルトの名無しさん [2017/11/18(土) 06:06:05.59 ID:mIICZMYh0.net] 自分のコードでさえ後で読むと読みやすく書いたつもりが裏目に出ていたりする
757 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 08:23:02.49 ID:cx1PUhyJ0.net] 奴らはnewしても決してdeleteしないからな
758 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 11:32:01.12 ID:azZ7ClyG0.net] 俺も最近unique_ptrに任せっきりでdeleteってほとんど書かねえわ コピコンの=deleteとかは書くけど
759 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 12:02:10.83 ID:Erlsd62p0.net] >>739 古いコンパイラ(つっても10年くらい)だと、クラス内の配列をイジるとクラスオブジェクト自体がイジられたことになるので最適化放棄とかしてたしなー そういうのだとvectorなんて最適化放棄しまくり。
760 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 13:45:01.11 ID:6KFO0fze0.net] バカは素直にスマポ使っとけばいいのにな
761 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:09:50.22 ID:fgAW9Gk/0.net] >>748 オブジェクトXに対するアクセスの最適化放棄はコンパイラの知りえない形での Xへの副作用が有り得ると判断された場合に行われるがこれは現用コンパイラでも変わらん 改善したというのはコンパイラの能力向上というよりは、テンプレートによるインライン展開のご利益なのでは… (つまりstd::vectorは元来最適化向きの進化である
762 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:13:16.03 ID:fgAW9Gk/0.net] 例: 次のコードの並びにおいて、 1と3の読み込み結果は同一とはみなされず、1〜3を通してのX.aのレジスタ割り当ては行われない 1. Xのメンバaを読む 2. 外部リンケージ(かつ素性の知れた組み込み関数以外)の関数foo()を呼ぶ 3. Xのメンバaを読む 特効薬はfoo()のインライン展開
763 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:16:28.52 ID:fgAW9Gk/0.net] なお手動を厭わないなら次の風にしても良い: 0. auto変数v = X.a 1. X.aを読む代りにvを読む 2. 外部リンケージ(かつ素性の知れた組み込み関数以外)の関数foo()を呼ぶ 3. X.aを読む代りにvを読む これならいくら古いコンパイラでもvを1〜3を通してレジスタ割り当てすることが気体できる
764 名前:デフォルトの名無しさん [2017/11/18(土) 16:28:12.38 ID:gZtBhbAH0.net] 浮動小数点をすべて網羅するループが書きたいのですがどうすればいいでしょうか。
765 名前:デフォルトの名無しさん [2017/11/18(土) 16:29:45.36 ID:CUoz+hOS0.net] ラスボス級が現れた。
766 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:46:32.60 ID:gZtBhbAH0.net] takashiijiri.com/study/miscs/fastsqrt.html やりたいことは、上のサイトにある高速根号計算の精度検証です。 サイト内では2の根号に対して精度検証していますが すべての倍精度実数に対して検証をしたいと考えています。 64bitの整数のビット表現を、同じビット表現の倍精度実数に変換できれば 整数についてループを回すことで網羅できると考えています。 変換の方法をご存知の方がいれば教えて頂けないでしょうか。
767 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:47:50.09 ID:R4dFDjUs0.net] >>753 イプシロン足してくとか。
768 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:48:48.90 ID:np1Yc2el0.net] >>755 memcpy
769 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:49:32.41 ID:R4dFDjUs0.net] >>755 IEEEの仕様読め。 https://ja.wikipedia.org/wiki/IEEE_754
770 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:50:13.11 ID:R4dFDjUs0.net] >>757 reinterpret_castでいい予感。
771 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:51:55.15 ID:np1Yc2el0.net] >>755 ところでその検証、何年ぐらい時間かけていい話なの?
772 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:53:01.86 ID:np1Yc2el0.net] >>759 未定義動作でも「いい」と言うなら、そう。
773 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:55:15.51 ID:R4dFDjUs0.net] あー検証だからな。すまんかった。
774 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:20:21.34 ID:gZtBhbAH0.net] みなさま、レスありがとうございます。 >>757 memcpyでできそうです。ありがとうございます。 int main() { double f = 0; for (unsigned long long i = 0; i <= -1; ++i) { void* fp = static_cast<void*>(&f); void* ip = static_cast<void*>(&i); std::memcpy(fp, ip, sizeof(i)); std::cout << f << std::endl; } system("pause"); } >>760 そんなに時間かかるんですかね。。。 1週間ぐらいは覚悟してたんですが。 とりあえず回してみます。
775 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:32:14.09 ID:np1Yc2el0.net] >>763 https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ > ... you can test every float bit-pattern (all four billion!) in about ninety seconds. ... 32bit が 90 秒ほどで済ませられるそうな。 64bit だと単純計算で・・・ 735439.6... 年ぐらいかな。 1週間で済ませようと思ったら 38347922 並列ぐらいで走らせればよさそう。 検証する計算内容によっても変わるだろうけど、まぁがんばれ。
776 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:35:34.11 ID:hpuIg+Nf0.net] とりあえず範囲を絞って回してみて、 力任せの方法で受け入れられる処理時間なら単純なプログラムのまま、 時間かかりすぎるようなら先にプログラムを洗練させる、としないと。
777 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:56:05.12 ID:gZtBhbAH0.net] >>764 ありがとうございます。 32bitと64bitが桁違いですね 範囲を絞ったり、間隔あけてサンプリングしたりしてみます。
778 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 19:06:18.60 ID:cx1PUhyJ0.net] isnan()でnanチェック入れたほうが良さそう
779 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 19:44:12.36 ID:euoYf0NO0.net] >>761 未定義にはならなくね?ポインタtoポインタだからそのまま、で終わりでは。 なお、Cなら *(long long*)&f = i; // mov命令でコピー または f = *(double*)&i; // fmov命令でコピー >>766 まず仮数部53bit+指数部の偶奇で54bit分でいい。 非正規化数もいらないだろうから仮数部52bit扱いでもいい。 意味が分からないのなら仕様読め>>758
780 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 20:29:47.22 ID:np1Yc2el0.net] >>768 type-based aliasing rule (strict
781 名前: aliasing rule) というものがあってな。 (詳しく調べると闇に落ちるから言語オタクでもなければ深堀りはおすすめしない。) mempcy なら動作が定義されてるかというとそうでもないんで、 明示的に未定義といわれているかどうか(=最適化で問題を起こしやすいかどうか)の違いしかないんだけど。 [] [ここ壊れてます]
782 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 20:40:55.67 ID:b6ZSsfqz0.net] std::launder「そろそろ俺の出番だな」
783 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 21:23:52.47 ID:azZ7ClyG0.net] ここまでfrexpとldexpの話なし
784 名前:片山博文MZ mailto:sage [2017/11/18(土) 21:57:24.41 ID:QiNK1qRtd.net] https://github.com/katahiromz/RisohEditor せっかくだから、だれかバグ発見・修正してけ。
785 名前:片山博文MZ mailto:sage [2017/11/18(土) 21:58:52.49 ID:QiNK1qRtd.net] 初回の例外というのがよくわからない。。。
786 名前:デフォルトの名無しさん [2017/11/18(土) 22:06:57.57 ID:asu2qdyg0.net] なんか古い書き方だから2000年ごろからの年季の入ったソースかと思ったら最近の奴なんだな
787 名前:片山博文MZ mailto:sage [2017/11/18(土) 22:12:33.66 ID:QiNK1qRtd.net] >>774 古臭い技術専門が時代遅れのために作っているもんだから、古いと言われても仕方ない。 auto、C++11が使えるclang++に移行したい。
788 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 22:42:09.82 ID:euoYf0NO0.net] >>769 調べたけどこれでいいのか? https://sta
789 名前:ckoverflow.com/questions/98650/what-is-the-strict-aliasing-rule これならreinterpret_cast関係ないじゃん。static_castにしたところで変わらん。 ただそれ以前に該当しないだろ。 「同一のメモリを違う型としてaliasしたときにコンパイラがそれに気づけず最適化で削除してしまう」という問題であり、 今回はそうではない。 > mempcy なら動作が定義されてるかというとそうでもないんで ほんとか?それじゃmemcpyマトモに使えないじゃん。 void*は++で1増えるって仕様に決まったはずで、、、と思ったがこれがgcc拡張だという話があり、このことを言っているのか? ならグダグダ言わずにCキャストで書けよもう、としか思わないが。 或いはC++的には許せないのかもしれんが static_cast<double>にしてしまうとかか? [] [ここ壊れてます]
790 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 22:48:23.04 ID:euoYf0NO0.net] すまんミスった × static_cast<double> ○ static_cast<double*>
791 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:20:13.09 ID:np1Yc2el0.net] >>776 static_cast じゃコンパイル通らない。 "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので 未定義動作になる。結果は「最適化で削除してしまう」に限らず、何でもアリだよ。 これが「「同一のメモリを違う型としてalias」に該当しないという理屈も無いでしょ。 memcpy の結果が定義されてるのは、同じ型のオブジェクト間でのコピーだけだったかと。 違う型の間で memcpy した結果の値が実は定義されてるということなら実に興味深いので ぜひ規格の該当箇所を示して欲しい。 この場合の C スタイルキャストの動作は reinterpret_cast に丸投げされるだけなので話は変わらないよ。
792 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:37:48.32 ID:5VdCNKN70.net] ここまでnextafter/nexttowardが出てきていない
793 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:38:32.35 ID:euoYf0NO0.net] >>778 > "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので してないぞ。 それは「fのアドレスを(long long*)にキャスト(この時点でlong long*型)したアドレスに対しiを書き込め」 であって、つまり long long に long long を書いている。だからmovが出る。 逆に f = *(double*)&i; は double に double を書くから fmov が出る。 その後の最適化で変更されるのはまた別の話。 > static_cast じゃコンパイル通らない。 だったら最初から>>759 の言うとおり、reinterpret_castでいいだろ。 > 違う型の間で memcpy した結果の値が実は定義されてる void* と void* なんだから同じ型だろ。何言ってんだ? お前、基本的に理解がずれてね?
794 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:47:06.34 ID:np1Yc2el0.net] >>780 なるほど、オブジェクトの型と式の型との区別がついてないんだね。 そこの理解無しで aliasing rule に関する話は無理だから、 C++ の規格を読み直すなりして区別が付くようになってからの出直しをおすすめする。
795 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:50:31.47 ID:euoYf0NO0.net] >>781 俺には君が全く理解出来てないように見えるけどね。 まあ平行線だろうし、終わりでいいけど。
796 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:03:31.90 ID:xhmNfS4m0.net] >>782 そうなると GCC も「全く理解出来てない」ことになるねぇ。 https://wandbox.org/permlink/WMFUTpXAgs2oZuos > prog.cc:5:17: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] > *(long long*)&f = i; > ^ > prog.cc:6:18: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] > f = *(double*)&i; > ^
797 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:12:55.40 ID:XAwzlQ9S0.net] >>782 それ以上恥かきたくなかったらこれ読んでくるといいよ blog-ja.intransient.info/2011/05/c-13.html
798 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:41:57.82 ID:p3uF8GIb0.net] まあ未定義な動作がどこまで行っても未定義な動作であって(教条主義的には)悪なのは確かだが >>784 のリンク先のを読むと >ストアによってPの値が変わる可能性を考慮しなくてはいけないからだ。 という理由で最適化できないケースがあるから考慮する代りに未定義動作ということにしますた! というだけで、ストアによってPの値が変わらないなら特に問題を生じないように思える… で、ストアによってPの値が変わるケースというのは int main() { P = (float*)&P; // このキャストによって zero_array の中で TBAA 違反となる zero_array(); } みたいな変態的なケースしかなさげ;
799 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:54:18.30 ID:SsMAbqSz0.net] >>784 答え書いてんじゃねーかよ。 > この種の未定義な振る舞いは、-fno-strict-aliasing フラグを指定することで無効にすることができ つまり指定すれば万事解決だ。 ただその前にwarning出てても動作するとは思うが。 > この種の型の乱用はあまり一般的ではないので、標準委員会は、"妥当な" 型のキャストによる予期しない結果と引き換えに、大幅なパフォーマンス向上を選んだ。 これっていつから?LLVMに乗せた頃からっぽいが、、、日付や元URL見るかぎりC++11からか? あとこれって、Cもか? (Cでは俺が書いたようなキャストは常用されているから) 知っている人がいたらよろしく。
800 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:21:45.70 ID:p3uF8GIb0.net] つかmemset(buf, ch, nのbufって__restrictじゃなかったのか… 今知った……
801 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:24:03.10 ID:XAwzlQ9S0.net] C89からずーっとそうだよ お前が書いてるコードが動いてるのは、コンパイラがそうしないという保証を独自に与えているか(-fno-strict-aliasingはその一例) さもなくばたまたま動いてるだけ
802 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:33:36.82 ID:xhmNfS4m0.net] >>786 広く知れ渡ったのは gcc 2.95 で実際にそのルールに基づく最適化が行われるようになってからかな。 https://www.gnu.org/software/gcc/gcc-2.95/features.html > - Type based alias analysis is enabled by default. ... そこから数えてももう 20 年近く経つわけだが。 知らずにそんなキャスト常用してるなら是非悔い改めてくれ。
803 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:35:13.22 ID:p3uF8GIb0.net] (ま、__restrictな形でしかポインタしか使わない漏れには関係ないし…
804 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:37:52.26 ID:XAwzlQ9S0.net] ちなみに-fno-strict-aliasing付けるとこんな基本的な最適化さえ出来なくなって パフォーマンスが激悪化する可能性があるからな それを完全に理解した上で万事解決だと言ってるならそれでもいいけどさ int foo(double* pd){ int k = 42; *pd = 666; return k * 2; } -fno-strict-aliasingを付けた場合、戻り値を"84"に最適化することは出来ない なぜならpdのアドレスが&kを指してるかもしれないから (strict aliasing ruleが効いてればdouble*がintを指してたら未定義動作なのでケアする必要がなく最適化できる)
805 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:42:54.83 ID:xhmNfS4m0.net] >>791 引数で受け取った(有効な)ポインタが関数内のローカル変数を指すことは不可能だから、その例は最適化できるよ。
806 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:15:02.16 ID:XAwzlQ9S0.net] 有効なポインタならね デタラメなポインタがたまたま&kを指してるかもしれない 普通はそんなのは未定義動作だからケアしないんだけどそれをケアしろって言うのが-fno-strict-aliasing
807 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:22:43.60 ID:SsMAbqSz0.net] >>789 > mempcy なら動作が定義されてるかというとそうでもないんで (>>769 ) これは間違いだろ。784内見る限り、 > Cは、このような型変換をmemcpyを使って実現することを要求している。 なら、memcpy使えば正しい結果が得られるはずだし、そうじゃないとコンパイラのバグになる。 つまり、>>763 のコードは正しく動くはず、と読めるが。 ちなみに>>783 のページで色々試してみた。(もし編集が残っているようならすまん) 全てgcc 7.2.0 で、結果は以下。 ・CはC11/C11(GNU)の両方でwarinigも何もでない。 ・C++はこの中の一番古いC++03/C++03(GNU)の両方でwarinigは出る。 ということはかなり昔からC++ではそうだった、ということだね。全く知らんかったわ。 ここら辺がCの連中がC++を嫌っているところなのかもしれない。 >>788 おお、サンクス、C++89からか。 俺環はVC++2008だからね。MS側が吸収してくれてるわけか。 >>789 いや俺環では問題ないしな。 つかたぶんこれC++の話で、上記試した限りCなら問題ないんだよ。 ただ俺はbetterCの人だから、まあ微妙なわけだが、、、VC++2017とかに移行するときは気をつけるよ。 さてそのリンク先 https://www.gnu.org/software/gcc/news/alias.html も読んでみたが、つまり s->x_m[i] は s->a_m と型が違うから上書きしないはず、 だからループ内で毎回 s->a_m を取らずに前回の値をそのまま使っていい、ということらしい。(s->b_mも同様) ただこれなら for (unsigned long long i = 0; i <= -1; ++i) *(long long*)&f = i; は確実に動くけどな。ここで端折られるのはfのアドレス確認 &f 部分だけだから。 ただしstackoverflowの連中は言っていることが少し違うから、もうちょっと確認が必要だが。
808 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:26:53.00 ID:xhmNfS4m0.net] >>793 んなこたーない。 https://godbolt.org/g/wDD6Zk
809 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:37:45.46 ID:SsMAbqSz0.net] >>791 周回遅れですまんが俺には794に書いたとおり、 ・型違いは全てmemcpy使え。 と読める。だから763のコードはOKだと。 >>791-793 の内容は理解した。 さて再度だが、やはり以下は動くだろ。 for (unsigned long long i = 0; i <= -1; ++i) *(long long*)&f = i; ここで問題なのは、「fがiのアドレスをさしてたら未定義動作(&f==&i等)」であって、 i をコピーしてやらない、ではない。 791-793の言い分どおりなら、これはwarningが出てるだけで全く問題なく動くはず。 ただしstackoverflowの連中はちょっと違うことを言っているが。
810 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:42:26.05 ID:xhmNfS4m0.net] >>794 C の aliasing rule には memcpy, memmove によって宣言型を持たない(たとえば malloc で確保した)オブジェクトの型 (effective type) を変更できるという規定がある。 引用された「memcpyを使って実現することを要求している」はこのことだろう。 でも、 C++ にはこれに相当する規定が無い。
811 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:53:12.72 ID:xhmNfS4m0.net] >>796 残念、まだ理解できてないよ。 答えは >778 にある。 > "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので > 未定義動作になる。結果は「最適化で削除してしまう」に限らず、何でもアリだよ。 これ以上は規格見てからしゃべってくれ。
812 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 03:03:03.03 ID:SsMAbqSz0.net] てゆーか、見てなかったけど763はfor文回らねーじゃねーかよ! >>798 ちょうどよかったので今>>795 を改造してアセンブラ見てるんだが、、、すまんが今日は寝る。 昼前にはまた書くよ。
813 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 06:07:15.51 ID:p3uF8GIb0.net] 未定義動作マジコエー;;(>>784 のリンク先の次のページ ttp://blog-ja.intransient.info/2011/05/c-23.html
814 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 06:25:20.22 ID:p3uF8GIb0.net] プロセス屋さんががんばってCPUを3年ごとに倍早くしてくれるのだから 我々ソフト屋は口を開けて待っているだけにして 最適化なんてやめてしまえば良いのに 我々が忙しく働くということは、それだけバグを産むということなのだ…!
815 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 07:18:18.83 ID:mXpVaiBzr.net] >>795 出来ると主張する人に対して たまたまできない一例を根拠に 出来ないことの立証を主張されても…
816 名前:デフォルトの名無しさん [2017/11/19(日) 07:18:20.90 ID:Rb2sIcHm0.net] CPUだけ速くなってもDRAMの速度が昔のままだ .7CRなんて法則を持ち出すまでもなく 現実にCPU速度が飽和したと感じたことなどないはずだが
817 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 07:23:52.01 ID:mXpVaiBzr.net] >>795 >>802 は夢をみた。忘れて
818 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 08:50:45.23 ID:OzmZfN1I0.net] >>768 読んでも分からないときは?
819 名前:デフォルトの名無しさん [2017/11/19(日) 10:12:41.15 ID:Rb2sIcHm0.net] >>805 ここで実験してみるとか https://people.rit.edu/meseec/eecc250-winter99/IEEE-754hex32.html
820 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:02:38.85 ID:SsMAbqSz0.net] >>795 改造は-fno-strict-aliasing有り無しによらず動くコードが出た。詳細は以下。 https://godbolt.org/g/QaSwTn -O3 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra で mov QWORD PTR [rsp+8], rbx (27,29行目)が出る。 -fno-strict-aliasing を切っても同じ mov 命令が出る。 だからこれはwarningが出ているだけで動くコードが出る。 このときのコードは以下。 void test() { double f = 0; for (long long i = 0; i <= 10; ++i) { *(long long*)&f = i; // (A) std::cout << f << std::endl; // (B) } }
821 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:04:16.49 ID:SsMAbqSz0.net] >>798 なお上記のGCC結果、或いは以下GCCのドキュメントは読んだ。 (ついでに後出の仕様書もチラ見したが、やはり今のところ君の理解がずれてるという見解だ。) https://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#index-fstrict_002daliasing-750 ここでは以下コードがアウトだと言っている。 union a_union { int i; double d; }; int f() { double d = 3.0; // (C) return ((union a_union *) &d)->i; // (D) } アウトな理由だが、上記と794内URLによると、「『型違いのaliasはない』と仮定して最適化」する為であり、 つまり(C)はd名でdoubleに書き(D)はi名でint読み出しだから(C)と(D)は関係ない、 よって(C)はデッドコードでいきなり(D)の読み出ししてよし、ということらしい。 ただこれだとやはり上記(A)(B)は動く。(A)も(B)もfの読み書きであり、aliasして無いからだ。 この規定は「型違いの『aliasは』ないものとみなす」であり、aliasしてなければ関係ない。 今のところ見る限り、他の例も必ずalias(別名でアクセス)している。 なお正しくはunionを使え、ということらしい。>>763 まあ確かにunionはこれ用ではあるが、単発ならCキャストする奴が多いとは思う。 そもそもunionは撲滅対象だと思っていたのだが、これは意外だ。 (或いは仕様上 char*, unsigned char* については許可《どう見ても妥協だが》しているので、void*ではなくchar*にすればいい)
822 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:06:08.29 ID:SsMAbqSz0.net] 仕様書は以下でいいか?読み慣れてないからだいぶ推測が入るが、 www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf 俺の結論は以下かな。 ・gccのは -fstrict-aliasing で、あくまで alias についてだが、仕様書内は alias なんて関係ない。 ・fstrict-aliasing 出来る理由が3.10.10によるのなら、reinterpret_castの存在価値はなく、仕様書内に矛盾がある。 ・おそらく reinterpret_cast 撲滅で union に書き換えろ、という方向か? aliasってのは多分折衷案で、union 以外は全部アウトにしたいっぽい。 詳細は以下。 5.2.10 Reinterpret castでは特に妙なところはなし、型キャストは為される。 aliasについては3.10.10だが、reinterpret_castしてれば the dynamic type 扱いでアクセスに問題なし、と見る。 3.10.10.の注 54) The intent of this list is to
823 名前: specify those circumstances in which an object may or may not be aliased. なんだから、やはりこれは alias されているかどうか?であって、アクセスできるかどうかではない。 ただしここを根拠に undefined behavior だから最適化してよし、としてるのはかなり強引で、 (というかここでalias云々がかなり唐突で、そもそもaliasの話をここではしていない) (D)がreinterpret_cast扱いだというのなら仕様内に矛盾があることになる。 そしてこの解釈(=reinterpret_castされたものは the dynamic type ではなく undefied behaviorだからどうなってもよし)が通るのなら、 reinterpret_castの存在価値がなくなってしまうし、 aliasとかせこいことを言わず、reinterpret_cast相当のところは全部undefined扱いで削除していいことになる。 というか、多分コンパイラ側はこの主張で、これに対してユーザ側が反対し、 結果、 alias とかいう折衷案でごまかしているように読める。(既に書いたがaliasが唐突過ぎ) 確かに正しくはunionを使うべきであり、この流れだと将来的には reinterpret_cast は廃止で union しろってことになるのか? しかし逆に言えば、C++89以来これで大して変わらないのなら、早々急に変わることもないか。 [] [ここ壊れてます]
824 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:06:40.01 ID:PnhOPMpK0.net] >>787 ポインタの引数が1つしかないのに__restrictつける意味ないからでしょ
825 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:19:11.46 ID:p3uF8GIb0.net] コンパイラがうまくType-Based Alias Analysis出来るケースをいくら列挙したところで Type-Based Alias Analysisできないケースが簡単に生じることは否定できない事実じゃんヤバイじゃん? unionの使用が解決策というのも語弊があって、unionのメンバのアドレスを取ってから関数foo()に渡す手順だと foo()のコンパイル時には渡ってきた2つのポインタが、型が違うけど(ループ変数などの条件次第で)同じ領域を指す(ことがある) かどうか(ループを実際に実行してみねば)判断つかないじゃん?→コンパイラは怖くてループをmemcpy()やmemset()に置き換えられない つまりunionこそ別の翻訳単位に属する関数に下手な渡り方をするとaliasingのすくつと化す気配が微レ存 元を断つにはやっぱID:xhmNfS4m0やGCC様がおっしゃるように、 そもそも型の混同要因(つまりポインタのキャスト)を絶つか、最適化が効いてほしい関数でプログラマが明示的に__restrictするしか、 ※ 個人の感想です
826 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:25:36.63 ID:67VHGIrY0.net] >>808 > ただこれだとやはり上記(A)(B)は動く。(A)も(B)もfの読み書きであり、aliasして無いからだ。 どうも "alias" の有無を名前に基づいて考えてるみたいだけど、 C++ (ほか多くのプログラミング言語)の文脈ではソースコード中で使われる実際の名前は関係ないんだよ。 "*(long long*)&f = i;" は "auto p = (long long*)&f; *p = i;" と等価であり、 これらのうち名前をつけた後者だけがエイリアスの問題があるということはなく、 どちらも f が表すオブジェクトに対してエイリアスがある状態と言う。 (最適化器の気持ちになって考えればわかりやすいんじゃないかと思うんだけど・・・。) 3.10.10 の注が "alias" に言及しているのも、このルールが "aliasing rule" と 呼ばれるのもそういうこと。 > なお正しくはunionを使え、ということらしい。>>763 > まあ確かにunionはこれ用ではあるが、単発ならCキャストする奴が多いとは思う。 union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 gcc は( -fstrict-aliasing の説明にもあるとおり)特別ルールを設けてある程度の保証を与えている状態。 https://gcc.gnu.org/bugs/#casting_and_optimization > To fix the code above, you can use a union instead of a cast (note that this is a GCC extension which might not work with other compilers):
827 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:26:49.64 ID:67VHGIrY0.net] >>809 > ・fstrict-aliasing 出来る理由が3.10.10によるのなら、reinterpret_castの存在価値はなく、仕様書内に矛盾がある。 元の型に戻せば元通り使えることが保証されているので、変更できない既存ライブラリの型に情報を無理やりねじ込んだりするのには使える。 3.10 の例外により unsigned char* などによるオブジェクト表現への直接アクセスにも使える。 > aliasについては3.10.10だが、reinterpret_castしてれば the dynamic type 扱いでアクセスに問題なし、と見る。 まだオブジェクトの型 (dynamic type) と式の型との区別がついてないようだねぇ。
828 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:38:42.54 ID:p3uF8GIb0.net] >>810 memset()にわたるbufが__restrictでないポインタでないということは、関数の中で memset(p, 0, 1000); ... memset(p, 0, 1000); と2回呼んだとき、pが非__restrictだったりグローバル変数だったりするとバカ正直に2回memset()されてしまう… また、memset()は該当しないが 一般論としてポインタの引数が1つしかなくとも大域変数経由で(一見別のエリアを指すように見える)ポインタを受け取るケースがあるので 1引数関数でも__restrictが要るケースがあるんじゃわ;
829 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:43:08.58 ID:SsMAbqSz0.net] >>811 808のコードで言うとね、 union a_union { int i; double d; }; int f() { double d = 3.0; // (C) return ((union a_union *) &d)->i; // (D) } がアウトで、 int f(a_union* u) { u->d = 3.0; // (E) return u->i; // (F) } にしろってことだよ多分。これは>>812 内URL内容とも一致する。 >>812 と、ここまではいいとして、これもGCC拡張であり、 > union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 これはマジなの?C++のunionのところを読めばいいのか? > 最適化器の気持ちになって考えればわかりやすいんじゃないかと思うんだけど・・・ これの可能性も考えたんだが、これまで全ての例で必ず別名をつけられてる。 LLVMはあまり知らないが、LLVMにおいてはレジスタへの再代入は禁止のはずだから、 同じレジスタがずっと使われてて最適化器からも「同じだ」と見える可能性もあるよ。
830 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:46:54.14 ID:p3uF8GIb0.net] ごめ>>814 の前半は思い過ごしかorz 別にmemset()側に__restrictは要りませんな…
831 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:52:43.00 ID:SsMAbqSz0.net] >>813 3.10.10.4 a type that is the signed or unsigned type corresponding to the dynamic type of the object, って言ってんだから基礎型も the dynamic type に含まれてると思うぞ。 > 変更できない既存ライブラリの型に情報を無理やりねじ込んだりするのには使える。 使えない。 reinterpret_castの結果がlvalueとして正当ではない、だからundefinedで何やってもおk、 というのが最適化していい根拠なんだろ。だったらreinterpret_castしたその値を使う時点で駄目だろ。 lvalueとして正当に使えると言うのなら、undefinedじゃないんだから最適化で削除しては駄目だ。 ただまあ、ここら辺を俺と君でやりあっても意味が無い。 おそらく20年前にガチで同じことが彼らによって既に為されているはず。 俺がコンパイラを作るわけでも無し、俺は現状確認だけでいいよ。
832 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:57:33.47 ID:PnhOPMpK0.net] >>814 >>816 >一般論としてポインタの引数が1つしかなくとも大域変数経由で あ、そういうことか・・・ まぁmemset使ってそういう症状出るとしたら、呼び出し側のpでつければいいよね 自分は__restrictそんなに使い倒してないけど、C++の標準に入らないのかな
833 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:03:35.17 ID:xhmNfS4m0.net] >>817 これだけ言われてまだ dynamic type が何なのか読んでないとしか思えない発言が来るか。 https://timsong-cpp.github.io/cppwp/n4659/intro.defs#defns.dynamic.type > reinterpret_castの結果がlvalueとして正当ではない、だからundefinedで何やってもおk、 > というのが最適化していい根拠なんだろ。だったらreinterpret_castしたその値を使う時点で駄目だろ。 ポインタの reinterpret_cast で型違いの結果を得ることは未定義動作にならないし、 それに * を適用して lvalue
834 名前:を得ることも未定義動作にはならない。 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。 [] [ここ壊れてます]
835 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:04:02.65 ID:p3uF8GIb0.net] >reinterpret_castの結果がlvalueとして正当ではない えっ合法なんじゃ… int x = 10; char* p = reinterpret_cast<char*>(&x); *p = 2; // *pがlvalueであるところの式 x = (int)*p; // 元の型へのキャストバック printf("x=%d\n", x); // 2 多分最適化されると printf("x=%d\n", 2); になる
836 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:19:05.40 ID:SsMAbqSz0.net] >>812 > union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 一応unionのところ(9.5)読んだ。これは書いてなかった。 ただしGCCが「独自拡張だ」って言ってんだからどこかにはあるのだとは思うが。 章番号分かればよろしく。まさか、書いて無いから未定義って奴か? なお9.5.5ではanonymous union ってのが定義されてて、どうもこれでやれってことっぽい。 例は以下。 void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; }
837 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:22:01.05 ID:p3uF8GIb0.net] dynamic_typeはdynamic_cast<>とかtypeidの実装がvtableを悪用した黒魔術なので使わなーい それはそうとして、Type-Based Alias Analysisの障害となるaliasingだけことさら問題視するLLVMの人らのスタンスはフェアではないキモス 同じ型でもaliasingは起こそうと思えばいくらでも起こせるし、コンパイラはプログラマーが意図的にaliasingさせるケースが有り得るのではと 猜疑心にとらわれて十分な最適化ができないのは同じ やっぱC++は関数型プログラミング言語にシフトすべき頃合い
838 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:27:33.98 ID:SsMAbqSz0.net] >>819 3.10.10には the dynamic type と cv-qualified version of the dynamic type しかないのだが、 では double や long long は何型なのだ? > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。 ではその aliasing rule を読もう。何章だ? なんとなく aliasing rule はコンパイラ側の仕様で、C++の仕様では無いと思うのだが。
839 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:35:56.40 ID:xhmNfS4m0.net] >>823 なんでせっかくリンク貼られた定義を無視するの?(・・・英語まともに読めないならそう言ってね。) dynamic type は式を評価した結果の属性であって型の分類ではない。 aliasing rule は basic.lval にあるルール "If a program attempts to access ... the behavior is undefined" を指す。 https://timsong-cpp.github.io/cppwp/n4659/basic.lval#8
840 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:36:33.89 ID:BMNBgd4s0.net] 規格キチガイとの会話は不毛 ツルッツルピカピカ
841 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:39:23.48 ID:SsMAbqSz0.net] >>822 違うぞ。 794内リンク読む限り、確かにこの最適化はフェアだし、使われていい。 というか、それ以前はポインタが一つでもあったら全く最適化が出来なくなっており、 確かにそれは問題視されてた。 だから標準化委員会がそっちを選んだ、というのは分かる話だ。 違う型でエイリアスすることはほぼないし。 問題は意図的にやりたいことが偶にあって、そのときにどう回避するかだよ。 763がこれに該当する。
842 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:51:01.10 ID:xhmNfS4m0.net] >>826 現行の規格で保証される範囲でまともな方法を見出そうとしてるなら、苦労に見合う実りは得られないからやめとけと言っておく。 標準化委員会のおおかたもそんな認識だから bit_cast なんていう提案が好意的に進められている。 www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html
843 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:53:50.85 ID:SsMAbqSz0.net] >>824 では最初から分かるようにそう言え。 こちらは仕様書を読むのが仕事ではないので、そもそも用語も知らない。見て分からなければそれまでの話だ。 つか、lvalue, rvalue もひどいが、 xvalue とかもでてきて、いよいよC++はどうしようもなくなりつつあるなと実感したよ。 Linusが嫌うわけだよこれは。 ただまあこれは本題でもない。 aliasing rule の確認の方が重要だ。 してそのリンク先、3.10.10と同じだ。 > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。(>>819 ) これはどこからそう取れるんだ? reinterpret_castをした結果が正当なlvalueなら、それをデリファレンスした結果も正当なlvalueだろ。 この章にはどこにも”aliasしてる場合”なんて記述はない。 だらからここを根拠にするのがそもそもおかしいんだよ。 君が期待することがここに書いてあるとしたら、例えば以下になるべきなんだよ。 the dynamic type of the object IF THE OBJET IS NOT ALIASED, とかね。でも実際はそうじゃない。
844 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:10:52.86 ID:SsMAbqSz0.net] >>827 つか、完全に暴走してるなこれは。 これならmemcpyと同じだし、 わざわざ別に作らずともmemcpyを正式に認めてCと同じ並びにしたほうがいい。 それ以前に reinterpret_cast が使われている関数内は自動的に -fno-strict-aliasing すればいいだけなんだが。 (関数単位でこの最適化を切る。ほぼ全てこれでいけるはず) ただまあ、これが真面目に議論されているのなら、仕様書の文面や俺の感想はともかく、 君の言う通り、今のC++の仕様では対処する方法がない、ということなのだろうね。
845 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:11:41.87 ID:xhmNfS4m0.net] >>828 "If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined" これが lvalue (それ自体は未定義ではない)を通した「アクセス」を未定義とするルールとして読めないのだとしたら、もうどう説明しても無理だろう。 用語を知らないといいながら共通の定義を求めるのではなく開き直って勝手な解釈に基づく話を進められるようではまともな会話にもならない。 説明は諦める。 規格や先人の解説を読みなおすなりして誤りに気づいてもらえれば幸いだ。 https://www.google.com/search?q=aliasing+rule
846 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:30:16.51 ID:SsMAbqSz0.net] >>830 ちげーよ。 俺は、reinterpret_castの結果が正当なlvalueなら、それはド頭の the dynamic type of the object に該当するから、 *(long long*)&f = i はありだろ、と読んでるんだよ。そこは君も同じだろ。 > ポインタの reinterpret_cast で型違いの結果を得ることは未定義動作にならないし (>>819 ) つまり (long long*)&f で long long* 型になるのはおk ←君の見解ね、俺も同意だが。 > それに * を適用して lvalue を得ることも未定義動作にはならない。 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動 (>>819 ) つまり、*(long long*)&f もおk ←これも君の見解ね、俺も同意で。 > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある ここが違う。 3.10.10には alias が云々って何も書いてないだろ。 しかも *(long long*)&f = i; は両方とも long long なんだから、「型違い」のaliasではないんだよ。 だからGCC等の -fstrict-aliasing には該当しない。 というのが文面からとれる意味だ。あくまで「文面」な。 ただまあ、実際にはそうじゃないんだろ。
847 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:33:08.86 ID:SsMAbqSz0.net] ああすまん、ちょっと慌ててて余分なコピペされてるわ。 上記1回目の「得られた lvalue を通したアクセスが…」は余分で。
848 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:34:35.29 ID:xhmNfS4m0.net] >>830 > 俺は、reinterpret_castの結果が正当なlvalueなら、それはド頭の > the dynamic type of the object > に該当するから、 > *(long long*)&f = i > はありだろ、と読んでるんだよ。そこは君も同じだろ。 違うねぇ。 オブジェクトの型 dynamic type は式の型とは違うし、式の型の影響を受けるものじゃないんだよ。 何度も区別しろと言ったつもりだったんだけど。
849 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:35:57.16 ID:xhmNfS4m0.net] ごめん、アンカーミスった。 >833 は >831 宛てね。
850 名前:デフォルトの名無しさん [2017/11/19(日) 16:43:31.03 ID:7jEiMXMd0.net] >>825 確かに自分に中身のないやつほどルールブックを神格化するよな 自分なりにどう思うなんて怖くて言えないから で、そういうお前さんは何か内容のある発言ができるのかね?
851 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:46:31.93 ID:Q6cWJ/Rgr.net] > *(long long*)&f で long long* 型になるのはおk んなこたーない doubleオブジェクトの領域にlong longでアクセスすることが未定義動作
852 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:22:20.65 ID:XAwzlQ9S0.net] double f = 0; と変数fを構築した時点で、「値0.0のdoubleオブジェクト」が作られてメモリに置かれるんだよ(規格で言うstored valueな) それはスタック回収やdeleteで破壊されるまでずーーっとdoubleのままで、変わることはないの 外側でポインタや参照をどれだけいじくり回したって決して変わらないの 家の横に「←ここは馬小屋です」って看板を立てたって、その家は家のままだし、勝手に馬を入れて飼うのは未定義動作なんだよ そろそろ理解したらどうなの
853 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:56:59.79 ID:BMNBgd4s0.net] >>835 内容ある発言と言われても別にこんなのは規格をひっくり返して議論するようなことでないし たぶん俺なら(little endianだとして) union Double { double v; struct { uint64_t f:52; // fraction uint64_t e:11; // exponent uint64_t s:1; // sign }; }; とかにするかな、それで何の問題も起こらない
854 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:00:09.08 ID:SsMAbqSz0.net] >>837 多分それが違うぞ。それはどこに書いてある? 少なくとも多くのCプログラマはそう思って無い。だから平気でキャストする。 そして830内ULRも読んだが、これも明示的なエイリアスがあるケースだ。 お前らが過度にびびって拡大解釈してるだけだろ。
855 名前:デフォルトの名無しさん [2017/11/19(日) 18:11:47.43 ID:7jEiMXMd0.net] あー、こいつcast-as-lvalueに完全に洗脳されている手合いかw
856 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:14:47.74 ID:xhmNfS4m0.net] >>839 https://timsong-cpp.github.io/cppwp/n4659/intro.object#1 > ... The properties of an object are determined when the object is created. ... An object has a type. ... 今度からは少なくとも自分でどこをどう探したかぐらい示そうな。
857 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:31:26.29 ID:SsMAbqSz0.net] >>841 嘘つけ。キャストした場合についてはどこにも書いてない。 型が普遍なんてのは、君が勝手に思い込んでいるだけだ。 というか、いわゆる「強い型」ってのはそうらしいが、C++はそうじゃないだろ。 ちなみに俺も反論を用意してたところだ。 https://godbolt.org/g/viYhGj 中身は795の場所で、ついでだから f = *(double*)&i; を試した。 予想通りこちらはfmov(movsd)が出た。(最適化は切ってある) つまり、俺が768で言ったように、 *(long long*)&f = i; // mov命令でコピー または f = *(double*)&i; // fmov命令でコピー になるんだよ。少なくともgccはキャストされればその型だと認識している。 君はこれを矛盾無く説明出来ないだろ。
858 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:51:00.89 ID:Q6cWJ/Rgr.net] >キャストした場合についてはどこにも書いてない はて、N4700の6.10/p8ほぼそのままの文面が少し上に貼り付けてあったような… >>821 N4700 3.9, 4.5/p1, 6.8全般, 6.10/p8, 12.3/p1, 12.3/p(5.3), その他「launder」が登場する記述全般
859 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:52:07.63 ID:p3uF8GIb0.net] 正しいそうなコードが吐かれたことは未定義動作でないという証拠には全くならない なぜなら未定義動作というのは コンパイル時のエラー、実行時のエラー(または例外)、一見正常っぽく気体通り動く、その他、 というあらゆる事象を包含し得るので、、、 もちろんコンパイラの変更で(ことによったらコンパイル条件の変更だけでも) ある日突然狂ったコードが吐かれる危険性があるが そうなっても未定義動作をプログラムした人の責任 よって現時点で正しいげなコードが吐かれることをいかに力説しても無駄で、 規格の矛盾の指摘にはつながらない
860 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:53:33.74 ID:xhmNfS4m0.net] >>842 オブジェクトの型に関与しない操作についていちいち記述があるわけないだろ。 まさか「〜によりオブジェクトの方は変わらない」とかの記述が全演算子&標準関数その他諸々について必要だ なんて言うわけじゃないよね? 未定義動作の結果はなんでもアリだと言っただろう。 その結果(想定の命令コードが生成されたこと)が未定義動作の結果のひとつだとして、何の矛盾も無い。
861 名前:片山博文MZ mailto:sage [2017/11/19(日) 19:03:59.08 ID:R56+Z6E80.net] inline const self_type *const_this() { return this; } template <typename T_TYPE> inline T_TYPE *drop_const(const T_TYPE *obj) { return const_cast<T_TYPE *>(obj); }
862 名前:デフォルトの名無しさん [2017/11/19(日) 19:04:38.54 ID:RgqRbH7C0.net] ソースが仕様、ソース読めってやつか。
863 名前:デフォルトの名無しさん [2017/11/19(日) 19:25:00.73 ID:7jEiMXMd0.net] そう言って居直るやつは問題だが ソースを読まない言い訳にするやつもダメ 腐敗は両岸から起きうることだ
864 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 19:53:33.03 ID:SsMAbqSz0.net] >>844-845 うむ。それは一理ある。 >>845 では逆から行こう。reiniterpret_castのど頭、 > 5.2.10 Reinterpret cast > 1. The result of the expression reinterpret_cast<T>(v) is the result of converting the expression v to type T. vをTに型変換したのが結果だとそのまま書いてある。 これはどう解釈すれば、「型はどうやっても変更できない」と取れるのだ? さすがに無理だろ。 > 7. An object pointer can be explicitly converted to an object pointer of a different type. これも型を変更できると読めるが。そして再び1に戻ると、 > 1. ---- If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; つまり当然有効なlvalueであり、デリファレンスも可能だ。 だからキャストを反映してmovなりfmovが出るのだ。 違うか? 君が言うようにメモリ上の型が普遍なら、どうやっても i には fmov が出ては駄目だろ。 (と思ったが、君は837ではないのか、、、)
865 名前:デフォルトの名無しさん [2017/11/19(日) 20:02:38.24 ID:7jEiMXMd0.net] >>849 If T is an lvalue reference typeという但し書きがついているよな (double&)ならlvalueだが(double)は違う
866 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:09:33.36 ID:xhmNfS4m0.net] >>849 > これはどう解釈すれば、「型はどうやっても変更できない」と取れるのだ? 式の型 (static type) は変わるが、オブジェクトの型 (dynamic type) は変わらない。 > 君が言うようにメモリ上の型が普遍なら、どうやっても i には fmov が出ては駄目だろ。 未定義動作ならなんでもアリだと言った。
867 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:15:36.23 ID:SsMAbqSz0.net] >>851 それで突っぱねるのなら平行線だね。 俺は仕様書に詳しいわけでは無いから動作から説明するしかない。 君は仕様書には詳しいようだが、キャストした場合にも型が変更されないという記述を出して来れない。 ま、デッドロックだ。 とはいえ状況は色々分かったよ。ありがとう。
868 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:42:27.06 ID:Q6cWJ/Rgr.net] >つまり当然有効なlvalueであり、デリファレンスも可能だ。 仕様を引用して説明されてもこのとんちんかんな発言を繰り返すあたり、 知らないから間違えているのではなくオツムが悪いので必然的に無知になったと言うことに>>851 は気付くべき
869 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:47:51.98 ID:xhmNfS4m0.net] >>852 > 俺は仕様書に詳しいわけでは無いから動作から説明するしかない。 なら↓お前の理解に基づいてこの動作を説明できるか試してみるといいかもしれない。 https://wandbox.org/permlink/2aKzO4VN3KRDB6Gu > 君は仕様書には詳しいようだが、キャストした場合にも型が変更されないという記述を出して来れない。 式の型 (static type) とオブジェクトの型 (dynamic type) は別物だという客観的な 前提 [intro.defs] を素直に読みさえすれば何度も見えてるはずなんだけどな。
870 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:54:00.37 ID:XAwzlQ9S0.net] こいつわかってて引っ掻き回してるだけのような気がするわ そうじゃなかったら馬鹿すぎる
871 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:10:07.51 ID:JvH46D6m0.net] ある型の変数を入力として、別の型にキャストされた値を返すのはそりゃできるだろう 元の変数の型を変えることはそりゃ無理だろう
872 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:20:19.91 ID:SsMAbqSz0.net] >>854 それは何も不思議じゃ無いと思うが。 例の最適化もされてるし。 どこが俺の理解と矛盾してるつもりなんだ?
873 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:40:24.30 ID:xhmNfS4m0.net] >>857 お前の中でどういう理解になっているかは把握できていない。 その答えからすると、 "*(long long*)&f = i;" なら未定義動作にならないけど "auto p = (long long*)&f; *p = i;" なら未定義動作になる、 という理解なのかな。まぁそんなことは無いんだけどさ。
874 名前:デフォルトの名無しさん [2017/11/19(日) 22:14:48.53 ID:RgqRbH7C0.net] いやまあ無いんだけどな。 いつまで言い張る気なんだろうか。
875 名前:デフォルトの名無しさん [2017/11/19(日) 22:16:28.57 ID:RgqRbH7C0.net] あると言えばあるんだけどな。 そろそろごめんなさいしてはどうか。
876 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 22:24:05.56 ID:kv2+5Ve80.net] 本の虫での解説記事が待たれる
877 名前:デフォルトの名無しさん [2017/11/19(日) 23:33:53.04 ID:qbUCqX2r0.net] strict aliasing ruleについてはここで解りやすく解説されてる。自分で怪しいと思う奴は読め。 d.hatena.ne.jp/yohhoy/touch/20120220/p1
878 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 23:37:47.80 ID:SsMAbqSz0.net] >>858 ああそうだぞ。それは>>815 で既に言ったし、実際に発現事例は今のところ全てaliasされてる。 顕在化させるには、「別型」で「alias」しないといけないんだよ。 オプションの名前も全くそうだろ。 多分君は理屈が分かってないんだ。 あれはtypeグループごとにメモリフェンスしていて、 別typeグループに入っていると結果的にout-of-orderになるだけなんだよ。 それは常時動いている。 ただし different type で alias して無いと顕現しない(ユーザ側には見えない)というだけ。 だからその可能性がある部分にwarningが出る。 しかしwarningというのは「普通やらないけど大丈夫か?」であって「絶対駄目」ではない。 結局君は different type alias について正確に理解出来てないんだよ。 上記を覆したければ、alias無しで different type alias の最適化がかかっている例を持って来い。 君の言う、 > まぁそんなことは無いんだけどさ。 の例だね。多分無いから。 既に言ったがLLVMだからインデックスレジスタは完全に残るんだよ。(多分) キャストを知らないのだから理解出来ないようだが、(long long*) 部分は命令にならない。 (これはC++仕様書にも明記してあるが、C界では常識) だから *&f だけが残り、結果、 *(long long*)&f と *&f (=f) は同じLLVM命令になる。(はず) だからそこは問題視されてないんだよ。最適化器からも同じに見えるから。 逆に考えてみろ。同じtypeグループ内、例えば int と int が out-of-order になったら話にならんだろ。 だから同typeグループ内は alias があっても in-orderになってる。 そして別グループ double と int は常にout-of-orderになってるが、当然、関数でつながれているときにはフェンスされる。 例えば int a = max_idx(double*) みたいな感じで、doubleの配列から最大値の添字を取るときとかね。 だから different type で alias して無いとそれが見えないようになってるんだよ。 というのが俺の理解だ。覆す例があればよろしく。
879 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 23:50:16.66 ID:XAwzlQ9S0.net] ダメだこりゃ
880 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/20(月) 00:03:11.09 ID:y/6cZRj30.net] そろそろ専用スレを建てて欲しいな
881 名前:デフォルトの名無しさん [2017/11/20(月) 00:06:21.48 ID:Veq8ZMOx0.net] 最初に質問した奴が謝罪すれば治まるのでは。
882 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:12:55.32 ID:gqHMI2DN0.net] 最適化は人類には早すぎた 早すぎたテクノロジー
883 名前: mailto:sage [2017/11/20(月) 00:14:41.52 ID:Y8ntE/6M0.net] いきなりレベルの低い話で割り込んで恐縮です。 よろしくお願いいたします。 久々にJava から C++ に移行して、簡単なイテレータパターンを実装しました。 Java で書いた https://ideone.com/DJ9pI5 を元に C++ で書いてみたのがこれです。 https://ideone.com/FwNlc4 ここで、コンテナにあたる Aggregateクラス(具象クラスは BookShelf) の中に イテレータ(Iterator:具象クラスは BookShelfIterator) を作成して返すメンバ関数 iterator() を定義していますが、 C++ だからデストラクタも定義しないとね、と考えて 当初、Aggregate クラスに仮想メンバ関数 delete_iterator() を書いて Aggregate::iterator() と Aggregate::delete_iterator() を対にするように作っておりました。 しかし教科書をみると Aggregate::delete_iterator() みたいなデストラクタはそもそも定義しないようで、 普通に Iterator *it = BookShelf(具象クラス)->iterator(); delete it; でなんの問題もないようです。 なぜ、これで問題がないのかトンと見当がつきません。 イテレータを作った具象クラスの中でデストラクタを定義する、というのならば分かりやすいのですが、 抽象クラスのポインタをキャストもせずに直接 delete できるのは、どういうからくりになっているのでしょうか? よろしくお願いいたします。
884 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:34:03.39 ID:uuALJ8Da0.net] >>863 > 上記を覆したければ、alias無しで different type alias の最適化がかかっている例を持って来い。 これでいいかな。 https://wandbox.org/permlink/RNDO0CIl9UpsaRwQ
885 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:41:55.57 ID:uuALJ8Da0.net] >>863 ごめんまちがえた。 >869 じゃわかんないね。 https://wandbox.org/permlink/vuQgmlWOUcxhu5jW
886 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:53:02.54 ID:H8zFncfx0.net] >>869 せこいわw gcc7.2.0(そこの最新版)で%eにしたら見えるがな。 まあ努力はご苦労様。 とはいえ、gcc4.4.7ならこのコードでも顕在化するし、「aliasが要る」という要件が怪しいのは認める。 この最適化はまだ発展途上のようだね。
887 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:07:57.23 ID:H8zFncfx0.net] >>870 おっとすまん、輻輳してしまったが、869で問題なく分かったぞ。 そして両方とも、gcc7.2.0にするか、globalにすると直る。 したがって、 different type alias で問題が発生するのには 「aliasが要る」という俺の見解は間違いだ。 ただ、過度の最適化による不具合を防ぐ努力は行われており、 gcc4..4.7→gcc7.2.0でこのコードに関しては修正されてる。 とはいえgcc7.2.0でもどこまで動くか分かった物ではないね。
888 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:11:14.23 ID:uuALJ8Da0.net] >>872 さぁ、お前の罪を数えろ。
889 名前:デフォルトの名無しさん [2017/11/20(月) 01:32:56.30 ID:Veq8ZMOx0.net] 何で素直に謝罪できないんだろうね。
890 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:42:11.88 ID:mEO8F9pQ0.net] >>868 それが virtual の効果だとしか。 基底で virtual 宣言したメンバ関数群はそのポインタをまとめたテーブルが作られ、オブジェクトはそのテーブルを指すポインタを持つ。 派生のオブジェクトは派生側の関数群を指すポインタテーブルへのポインタを持つ。 だから virtual を使うと「変数の型ではなくオブジェクトが呼出すべきメンバ関数を知っている」という状況を作れるんだよ。 ただ、基底のデストラクタを virtual に指定しないときでも見かけ上は型システムをパスしてしまいコンパイルエラーにならない場合がある。 これは未定義だからやっちゃダメだよ。
891 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:59:59.63 ID:mEO8F9pQ0.net] >>868 ,875 Wikipedia にも解説があるやないけ https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
892 名前: mailto:sage [2017/11/20(月) 02:35:52.58 ID:Y8ntE/6M0.net] >>875-876 うーん、普通のポリモフィズムの話が同様に適用できるんですね… Base<-Derived1 Base<-Derived2 の基底・派生関係のとき Base *p = new Derived1() ならば、delete p; は delete (Derived1 *)p; Base *p = new Derived2() ならば、delete p; は delete (Derived2 *)p; となる、と考えていいでしょうか。 Base *p = new Derived1() ならば、p->method(); は p->method_Dirived1(); Base *p = new Derived2() ならば、p->method(); は p->method_Dirived2(); という話と同じなんですね。 んーなせ Aggregate::delete_iterator() を作らなくちゃ、と考えたのか逆にわからなくなってしまいました… ありがとうございました。
893 名前: mailto:sage [2017/11/20(月) 02:59:04.07 ID:Y8ntE/6M0.net] 次に >>868 のテンプレート版を書いてみました。 https://ideone.com/LO68r5 void * (Java の Object)をキャストするのを嫌ったという理由になります。 >>868 >class Iterator >virtual void *next() = 0; >class BookShelfIterator : public Iterator { }; >void *BookShelfIterator::next() >Book *book = (Book *)it->next(); https://ideone.com/LO68r5 そこで不思議に思ったことなんですが、 コンストラクタは template <typename T> class Derived : Base { public: Derived(){}; }; とテンプレート引数 T をコンストラクタ名をつけなくていい(public: Derived<T>(){}; としない)のに、 デストラクタは template <typename T> class Derived : Base { public: ~Derived<T>(){}; }; (クラスのメンバ関数宣言) template <typename T> Derived<T>::~Derived<T>() { } (クラスのメンバ関数定義) とテンプレート引数 T をデストラクタ名につけないといけないのでしょうか?何か分かりやすい理由はありますでしょうか?
894 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:03:42.40 ID:mEO8F9pQ0.net] >>877 キャストとは意味が違うんだよ。 上でさんざん議論してる static type と dynamic type の話とも関係あるのかなぁ? 入り組んでてよくわからん。 型はあくまでも Base* で、仮想関数テーブルを辿って必要な関数を呼び出すってだけだ。 繰返すけど、 Base のデストラクタに virtual がついてないときに Base のポインタに対して delete すると Base のデストラクタが呼び出されるだけになってまうので気をつけてな。 派生クラスのデストラクタが空っぽのときでもデストラクタが呼び出される必要はあるらしいぞ。
895 名前: mailto:sage [2017/11/20(月) 03:12:59.68 ID:Y8ntE/6M0.net] >>878 の続きです。 同じく、テンプレート版 https://ideone.com/LO68r5 にて一点不満におもったことがあります。 >>878 では基底クラスの記述について、 template <typename T> class Iterator { public: virtual T *next() = 0; }; 派生クラスは template <typename T> class XXXIterator : Iterato<T> { public: T *next(); }; template <typename T> T *XXXIterator::next() { ... } と書きました。 しかし本当は、基底クラスを純粋に一個にしたいと希望しているのです。 つまり基底クラスにテンプレート引数Tを書きたくない。 class Iterator { public: virtual ○○○ *next() = 0; }; と基底クラスを一つだけにしぼりつつ、 派生クラスにテンプレート引数を使用して記述することは可能でしょうか?○○○に書けるなにかいい記述はないでしょうか? テンプレート引数を使用した具象クラスに対応する、テンプレート引数を使用しない抽象クラスを書くことは可能でしょうか?
896 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:15:21.39 ID:mEO8F9pQ0.net] >>878 付けなくてもいいし、付けても通るってのは私は今初めて知った。
897 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:23:45.23 ID:mEO8F9pQ0.net] >>880 強引なキャストで出来る可能性はあるかもしれないけど、 常識的な方法では出来ないと思う。 ただ、そもそもそういう継承関係を作る必要は無いんじゃないか。
898 名前: mailto:sage [2017/11/20(月) 03:26:59.22 ID:Y8ntE/6M0.net] >>879 ありがとうございます。 meyers の effective C++ 第7章を読み返しています C++ には Java の fainal がないので、うっかり、std::string や std::vector を派生させてしまうところでした、危ないなあ…
899 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:30:13.52 ID:iECo0Ul80.net] >>868 混乱するならシンプルに設計したら?例えばこんな感じ?登録して表示するだけなら簡単でしょ? #include <stdio.h> #include <string> #include <vector> class Book{ public: std::string name; Book(std::string _name) :
900 名前: name(_name){} void show(){printf("%s\n",name.c_str());} }; class Books{ public: std::vector<Book *>m_list; Books(){} ~Books(){for (auto p : m_list) if (p) delete p;} void addBook(Book *p){m_list.push_back(p);} }; int main(){ Books books; books.addBook(new Book("aa"));books.addBook(new Book("bb")); books.addBook(new Book("cc"));books.addBook(new Book("dd")); for (auto p : books.m_list) p->show(); // iterator使いたいなら //for (auto it = books.m_list.begin(); it != books.m_list.end; it++) (*it)->show(); return 0; } [] [ここ壊れてます]
901 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:34:54.09 ID:mEO8F9pQ0.net] >>880 Java のことはあまり知らんので元ネタにした Java 版の方をよく見てなったけど、 interface のかわりに抽象クラスを使おうとしてたのか。 似たような機能に見えちゃうかもしれないけど、インターフェイスを強制する方法としては抽象クラスはあまり良くない。 C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 だけど「コンセプト」の機能が C++ に導入されるのが延び延びになってていまだ入ってないので、 traits とか SFINAE とかを使ったまわりくどいメタプログラミングで代用してるのが実情なんだ。
902 名前: mailto:sage [2017/11/20(月) 03:45:45.65 ID:Y8ntE/6M0.net] >>881 >付けなくてもいいし うーん、デストラクタの場合はテンプレート引数をつけないとおこられちゃいます… ×https://ideone.com/x5FrwU 69行目 ○https://ideone.com/FUJ3OO 69行目 よくわらからないな…
903 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:53:09.38 ID:mEO8F9pQ0.net] >>886 いや、型名の方には付ける必要あるよ ×: template <typename T> TShelf::~TShelf() { delete [] (this->t_s); } 〇: template <typename T> TShelf<T>::~TShelf() { delete [] (this->t_s); } △: 知らんかった template <typename T> TShelf<T>::~TShelf<T>() { delete [] (this->t_s); }
904 名前: mailto:sage [2017/11/20(月) 03:57:21.44 ID:Y8ntE/6M0.net] >>884 はい、すごくよくわかります!! std::vector とか、std::list とかstd::deque とかは、たぶんいけると思います。 mevius.2ch.net/test/read.cgi/tech/1434079972/14 mevius.2ch.net/test/read.cgi/tech/1434079972/19 なんとなくデザパタ本を読み返していて、車輪の再発明に没頭してしまいましたが、C# のデザパタ本、というのも聞かないし、もうデザパタは古いのかな…
905 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:58:54.21 ID:O993TKuI0.net] マジか 役に立つ日が来るかどうかはシランケド
906 名前: mailto:sage [2017/11/20(月) 03:59:06.77 ID:Y8ntE/6M0.net] >>887 ありがとうございます。確認いたしました。
907 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:59:26.41 ID:O993TKuI0.net] ↑ >>887
908 名前: mailto:sage [2017/11/20(月) 04:12:32.38 ID:Y8ntE/6M0.net] >>885 夜遅くにコメントいただきありがとうございます。 >C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 理解できます。コンパイル時に確定できるのなら最大限それに努める思想はたとえば constexpr にも現れていると思いました。 >抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 うーん、たぶん私が周回遅れなだけだと思いますが、じゃあ、ひところ、あれほどまでにもてはやされたデザインパターンは、どこにいってしまったのでしょう…もう誰もやらないのかな…
909 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:13:43.35 ID:mEO8F9pQ0.net] >>887 なんでこうなってるかっていうのは割と感覚的にやっちゃってるからうまいこと説明できひんのやけど。 クラステンプレートの中に関数テンプレートも書けたりするので template<class T> class foo { public: template<class U> void bar(void); }; 実装書くときはどれがどれに掛かってるかわかるようにせんといかん template<class T> template<class U> void foo<T>::bar(void) { } みたいな話なんじゃないかとコンパイラの気持ちになる仁奈ちゃんの気持ちになってた。
910 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:30:34.82 ID:mEO8F9pQ0.net] >>892 抽象クラスを使うパターンなんてのがあるわけ? GoF 本とか読んだことないから知らんけど。 それはインターフェイスをまとめた何かを作れって話とかじゃないの? C++ の抽象クラスを使えって話とは違ったりしそうだけど。 デザインパターンはあくまでデザインの話なんだから言語の具体的な機能はその時代に有るものでやるしかないし、 よりよい機能が提供されるようになったら使うだろ、そりゃ。 抽象クラスを使うやり方しかできないなら「デザイン」を学び取れてないってこった。 まあ今は C++ への理解も十分でないからってのもあるだろうけどさ。 ところで QZ って C++ スレの常連みたいに思ってたけど、 その割にアレなのでひょっとして共通トリップだったりするの?
911 名前: mailto:sage [2017/11/20(月) 04:42:32.81 ID:Y8ntE/6M0.net] >>894 >その割にアレなのでひょっとして共通トリップだったりするの? 単に、あれよあれよと、また、次から次へと忘れていくので、ぜんぜん進歩しないだけなのでした。 こんな感じ… https://www.youtube.com/watch?v=Hflpt1-kAl4
912 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 07:05:19.03 ID:8Dez9ldp0.net] 手元に古いGoF日本語訳(1999年初版)があったので覗いてみたら、 Iteratorのサンプル(C++)が>>880 みたいに抽象クラスで実装されていてびっくりした。 抽象クラスを使わなくても、処理の共通化を考えないなら問題ないし、 共通化したい場合でも、そこだけテンプレート化すればよいような気がする。 https://ideone.com/sFzBq4
913 名前:デフォルトの名無しさん [2017/11/20(月) 08:00:57.16 ID:GfOPAtNP0.net] VC++とか今でこそまともだけど昔はテンプレート周りがうんこすぎて風呂釜洗剤教の人のやり方に頼らざるを得なかったらしいね
914 名前:デフォルトの名無しさん [2017/11/20(月) 09:24:05.14 ID:9q5rB25R0.net] そういう「まとも」を求めてVCを選ぶのは情弱のすることだ 意味の違う「まとも」で定評のあるコンパイラであって
915 名前:デフォルトの名無しさん [2017/11/20(月) 09:46:04.69 ID:Veq8ZMOx0.net] Vistaまではgccでコンパイルしてたらしいからな。
916 名前:デフォルトの名無しさん [2017/11/20(月) 10:17:12.94 ID:5dn4op1oM.net] 初心者なんですがusing使い方を教えて下せえ
917 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:36:08.17 ID:Fx3rJ6pW0.net] usingは時代によって使える機能が異なる 昔はnamespaceから使える宣言を取り出す役割 最近は=を用いてtypedefの簡略化っぽい書き方が出来る
918 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:42:51.51 ID:Fx3rJ6pW0.net] 将来的にはusingがプロパティの役割まで担ってくれると余計な予約後増やさなくて済む希ガス
919 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/20(月) 12:17:25.71 ID:OatlO4rKM.net] >>897 最初なんてタダのマクロだったし、 4.xだってテンプレート使うと名称長さ制限にかかったり STLのBUGは何時までたってもそのままだし
920 名前:デフォルトの名無しさん [2017/11/20(月) 14:57:25.95 ID:ZHV8ZCmh0.net] ratioのバグとかinitializer_listとかね しっかりしているようで時おり大ボケで笑いを取る謎な会社だ
921 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 16:59:42.71 ID:CB3KD7K4p.net] >>883 重箱の隅だけどC++にもfinal導入されたよ、C++11からだっけ stlに付いてるかどうかは覚えてないけどw
922 名前:デフォルトの名無しさん [2017/11/20(月) 17:06:25.94 ID:ZHV8ZCmh0.net] 重箱の隅じゃあんめえ 仮想デストラクタがないことと継承禁止は近いが違う
923 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 17:20:13.60 ID:mEO8F9pQ0.net] std::vector とかを public 継承してもスライシングが起こらないように使う分には全然問題ないわけだしな。 でも人間はアホだからスライシングするし、スライシングしたときにコンパイルエラーにしてくれないから避けようっていう「習慣」なだけで、 言語機能としてはデストラクタが仮想になってないからといって継承が禁止されているってわけではないんだ。 そこらへんは確かに意味づけが違う。
924 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 17:54:47.05 ID:4sV97R+K0.net] デザパタは基本的にGC言語向きだしな C++とは相性が良くない
925 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 19:05:49.28 ID:RcaXyFV8d.net] C++の基本的なコーディングを学ぶのにオススメな書籍あるかな? テクニック集とかもあると読んでみたいと思っている
926 名前:デフォルトの名無しさん [2017/11/20(月) 19:11:23.76 ID:q0WTO8Pn0.net] EffectiveC++シリーズ Exceptional C++ C++ Coding Standards あたりの定番中の定番でいいだろ
927 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 20:12:37.95 ID:rJCmscgl0.net] ここって本職でやってる人らばっかりなんかね 日曜プログラマが気安く書き込んでもいいのだろうか
928 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 20:21:38.03 ID:mEO8F9pQ0.net] >>911 いいよ。 俺も趣味プログラマだけど偉そうに書き込んでるし。
929 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 21:53:59.25 ID:gqHMI2DN0.net] GoF本のうち Stateパターンは抽象クラス必須 Abstractなんちゃら系も抽象クラス必須 な印象
930 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:05:37.00 ID:vFwnmuVP0.net] >>911 プロがここでうんちく垂れてたら引くわな
931 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:07:59.95 ID:H8zFncfx0.net] >>873 最新版で該当ケースを探せず、 わざわざ5年前の版を持ち出してきてまで俺ツエーしたいヘタレを相手にしてしまい、すいませんでしたー gcc4.4.7(2012/3/13)の時点で対応できて無いという情報はものすごく役に立ちますー(棒) つかマジで、賢いつもりなら最新版で該当ケース探してgccに報告しろよ。 問題に遭遇したらとりあえず最新版、というのは基本だ。 ここを問題視する奴がgcc4.4.7なんて今使ってるわけないだろ。お前は馬鹿なのか? お前のその努力は誰の為にも役に立ってないだろ。 これは多分に政治的問題で、コンパイラ屋がごねているだけだ。 既に言ったとおり、 reinterpret_cast相当のことがなされている場合、その関数単位で -fno-strict-aliasing すればいいだけで、 これに関して技術/仕様的問題は何もない。 ただ、「ソースさえ正しければこんな問題は発生しない」とか言って、コンパイラ屋がごねてるんだよ。 だから、力関係が逆転すればいきなり全部直ってもおかしくない。 gcc7.2.0がどっちのアプローチ、 つまり、上記の通りばっさり最適化を切ってしまい、最適化ケースを積み上げる方向にしたのか、 或いは従来どおり、過度の最適化を検出し、最適化を防ぐケースを積み上げることにしたのかは、俺は知らない。 ただ、どちらのケースであっても、最新版で上手く行かないケースがあれば、それはgccにとっては有用な情報なんだよ。 それをわざわざ旧版で、しかも隠してしれっととか、意味無いしせこいわw 最新版で出現しないから焦ったか?小物感ありあり。 > まぁそんなことは無いんだけどさ。 とか言うから、お?釣りか?ならここは全力で釣られてやるさ、該当事例持って来いよ!って流れなのに、 事前に該当事例用意しておかずに釣りとかアホかテメーは。 君が最新版で完全にアウトなケースを用意してれば、ああこれは完全に俺の負けですサーセン、とお後がよろしかったのに、 gcc4.4.7であることにも触れず俺ツエーするとか、小物過ぎて泣ける。 お前もうちょっとスレの流れを考えろよ。
932 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:13:38.04 ID:cvRta7BJM.net] >>908 GoF本はc++とsmalltalkだったろ
933 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:48:11.84 ID:gqHMI2DN0.net] テンキー風のボタンの並びでモードによって意味が変わる(Num Lock ON/OFFのもっと複雑化したようなやつ というユザーインターフェースの実装はStateパターンのどくだんば そこまでレトロなのでなくてもGUIでお絵かきツールを集めたツールボックスなUIとか作ると Abstructなんちゃらパターンのどれかを再発明しているケースが多いと思う
934 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:04:17.12 ID:vFwnmuVP0.net] ←なぜか変換できない
935 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:35:39.24 ID:mEO8F9pQ0.net] 独擅場 ← どくせんじょう
936 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 00:48:45.97 ID:KkY90WH60.net] >>913 昨日 >>885 でまわりくどいメタプログラミングと言ってたのがそれだ。 State パターンのように特定のメンバ関数を持っていることを強制したいときには それを判定するトレイツを作って対応する。 たとえば >>886 にあるコードを対象に考えて、 「あるクラスがそのクラス自身のポインタを返す next という名前のメンバ関数を持っているか」 を判定するトレイツはこうなる。 template<class T> class has_next { template<class U, class V = T> struct helper : std::false_type {}; template<class U> struct helper<U, typename std::enable_if<std::is_same<decltype(std::declval<U>().next()), U*>::value, T>::type> : std::true_type {}; public: static const bool value = helper<T>::value; }; C++ 標準の type_traits を真似してるので使い方もだいたい同じ。 static_assert(!has_next<TShelfIterator<Book>>::value, "TShelfIterator must has next() method."); みたいに書いておけば TShelfIterator<Book> がメンバ関数 next を持っていることが保証される。 持っていなければコンパイル時にエラーになるから。 ここではひとつのメンバ関数を判定するだけのものを作ったけど、 Boost にはもっと汎用的にいい感じにかけるやつが有った気がする。 知らんけど。
937 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 01:13:43.73 ID:H+r6aFWv0.net] そんなくそレガシーなtraits 久々に見た…
938 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:31:41.16 ID:6BA+Ife8d.net] あるファイルに下のような文字が書き込まれていて xxxx=3 これの3を取得する完璧無欠なロジックなにかないかな
939 名前:デフォルトの名無しさん [2017/11/21(火) 17:32:59.03 ID:uRVBPn0b0.net] 完璧無欠とは?
940 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:36:16.46 ID:6BA+Ife8d.net] >>923 俺様のアルゴリズムは完璧だぜ!!! ってだけ まあそんなのないんだけど書き込みたかった
941 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 18:10:16.89 ID:B2ib4/wIa.net] 正規表現でよくない?
942 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:05:58.85 ID:DIhAB+/L0.net] リバースイテレータをfindしてイコールでセパレート。 って、数行から見つけるのか。 構文解析とかか?
943 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:38:49.19 ID:6BA+Ife8d.net] >>926 数行から見つける 設定値の中から見つける 実際は #xxxはdddの設定値 xxx=1 #yyyはcccの設定値 yyy=3 こんなのが繰り返し書かれてる 正規表現確かに良さそう忘れてた
944 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:53:50.67 ID:GhiisSyt0.net] (?<=^xxx=)\d+$
945 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 20:30:32.65 ID:0pu32Yjt0.net] float演算がdoubleよりも遅いってアジですか?
946 名前: mailto:sage [2017/11/21(火) 21:02:58.77 ID:xJ15vzkZ0.net] >>929 何が計算するかによる、としか
947 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:12:53.35 ID:0pu32Yjt0.net] さいですか
948 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:19:38.81 ID:muR8Mwv6r.net] >>922 ほれ https://wandbox.org/permlink/YK6UEOGxMToYE1SK
949 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:44:16.41 ID:6BA+Ife8d.net] >>932 すんごく綺麗なコードありがとう 見事に魔改造して糞コードにしてしまう自信がある
950 名前:デフォルトの名無しさん [2017/11/21(火) 21:55:27.92 ID:6jcLJvUW0.net] >>927 そういう設定ファイル的なものを読むならkeyとvalueのペアのリストつまりmapを返す実装を考えた方がいい
951 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:16:59.77 ID:6BA+Ife8d.net] >>934 俺もそうは思ってるのだけどその読み込む処理をどうしたら綺麗にできるかなぁって悩みなんだ マップ作ったあとに検索が綺麗なのかなとは思ってる
952 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 22:33:26.16 ID:KkY90WH60.net] 文法的には LL(1) かな? 素朴なパーサコンビネータでも充分に足りるのでその手のライブラリを導入すると楽にパーサを作れると思う。 それはともかく、「>>922 みたいな」というだけの仕様では ・数値以外が設定値にくることもあるのか? ・要素に改行を含められるのか? ・エスケープも出来るようにするのか? 等々が読み取れないし、多分 >>922 は考えてないんじゃないかなと思う。 オレオレ設定ファイルフォーマットを考えるくらいなら TOML とかいったよくあるフォーマットを採用すれば ライブラリが充実してたりして便利なので考えてみるといいかも。
953 名前:デフォルトの名無しさん [2017/11/21(火) 22:42:43.82 ID:uRVBPn0b0.net] ってかboostのPropertyTreeにiniパーサーがあるからそれ使うといいよ
954 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:42:58.28 ID:6BA+Ife8d.net] >>936 回答すると 数値以外もありうる 改行は値として入れない エスケープってなんだろう? xxxに関しては最大16文字の文字列(大文字小文字計52文字の組み合わせ) たったこれだけでも深いね ソフトウェアって神秘
955 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 23:00:05.88 ID:GhiisSyt0.net] ini-parser
956 名前:てのがなかなか良さそう picojson,rapidxmlなどが好きな人にはいいかも [] [ここ壊れてます]
957 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 02:34:39.84 ID:9vladmL60.net] 構文解析したいならbisonでも使ったらいいんじゃね?
958 名前:デフォルトの名無しさん [2017/11/22(水) 03:34:34.44 ID:ft6g9THr0.net] ム板で公開されたのがあったじゃないか。
959 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 10:29:13.01 ID:wHcXBwMz0.net] >>938 >>922 の完璧無欠なロジックてのは 最初に完璧無欠な入力規則を作ってから議論できるものだろ >数値以外もありうる 数値だけでもいろんな型があるわけだしこの程度じゃ何も語れない xxxx=3のような単純な形式はINIファイルとか>>936 のようなのとか利用するのが便利 最近はXML形式が推奨されてる ただしどれもが完璧無欠とは言えないけど
960 名前:デフォルトの名無しさん [2017/11/22(水) 10:59:36.64 ID:jvBgNmmT0.net] >>942 どこの最近?
961 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 11:55:13.96 ID:/unloUf+0.net] XMLは配列が直接表現できないし手で書くのがクソめんどくさいし見づらい その点JSONの方がずっとマシなんだけど標準JSONだとコメント書けない
962 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 12:48:47.95 ID:PiUoYWXr0.net] 適材適所、の一言で片付く問題 好きな方使え
963 名前:デフォルトの名無しさん [2017/11/22(水) 13:52:54.31 ID:gFgFfMOWM.net] 人が書く設定ファイルならtomlがパースのしやすさと書きやすさでバランスが良いと思う
964 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 16:17:23.80 ID:HDCbnteD0.net] >>946 dein.vimで使われてるの見て知ったけどまったくと言っていいほど広まらないね >>944 ド定番のYAMLでいいじゃん
965 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 20:12:53.57 ID:Rn9KsJdK0.net] Cargo の設定ファイルも TOML やぞ。 モダーンな言語のモダーンなツールは TOML がトレンド。 これ。 YAML みたいにインデントで構造を表現するのってパースめんどくさい。 個人的に YAML は不格好に見えて好きじゃないっていう主観もあるんだけど、 YAML ってそんなに定番ってほど目にしたことが無いな〜と思って考えたら たぶん俺の巣は Scheme スレやからやな。 Lisp 界隈では設定ファイルにはS式を使ってまうもんな。
966 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:00:11.47 ID:h+KIZtFy0.net] luaなんかもよく使われるけど、schemeやluaが設定ファイルとして使われるのは 呼び出し側の言語が同じであるか、他の用途で使うためにすでに組み込んでる場合がほどんどで 設定ファイルだけの為にLL組み込むにはお手軽とは言えないかな TOMLはいいとは思うんだけど 自分が使うなら仕様が固まってからの1.0〜は必須で ↓で300程度は使われてからかな $ apt-file search toml | grep "\.toml$" | wc -l 0 $ apt-file search json | grep "\.json$" | wc -l 3611 $ apt-file search yaml | grep "\.yaml$" | wc -l 1480
967 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:10:35.27 ID:W0SJQGiTM.net] 最近この手の話題に疎いからtomlとか知らんかったのでちょっとググったけどまあ好きなの使えや って感想しかないわ https://gist.github.com/miyakogi/e8631ce5f7c956db2313
968 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 21:16:10.07 ID:Rn9KsJdK0.net] パースの楽さだけで言えば JSON が優勝だけど人が手書きするには色々アレだからな。
969 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:20:22.39 ID:3/I2dLA90.net] 好きなの使えっつっても全部導入して試すの面倒や
970 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:56:28.30 ID:+hB2MqUt0.net] ES5以降ケツコンマOKになったんだからJSONも新規格にすりゃいいのに。
971 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:47:16.65 ID:AAzHTorM0.net] >>936 正規表現で済んでいるのになんでスタックが要るんじゃ!!!!!!11!1!!!!
972 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 00:25:32.50 ID:fj1LdTry0.net] >>954 意味がわからないので説明して。
973 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:36:02.97 ID:h8NdPAUM0.net] 文脈自由文法は解析にスタック(理論上は無限の段数のやつ)が要るクラスだが 正規言語は有限状態マシンで済む言語のクラス 今話題の設定言語は無限の入れ子は持たなそうなので正規言語で逝ける、
974 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:37:37.76 ID:h8NdPAUM0.net] と、 言いたいのでわ…
975 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 01:07:08.12 ID:fj1LdTry0.net] ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 同じ文法の構文解析器を作ればどっちのアプローチでもスタックの消費量はかわらんと思うんだけど。 より制限の強い方で「十分」っつーならそれはわかる。 C++ 標準に入ってる機能で出来りゃ楽だしな。 ただ、正規表現ライブラリだとエラーの検出場所の伝達方法とかで融通が利かなかったりするので、 ユーザーが入力する設定ファイルを解析するパーサを作るとなると作りこみ難いという感触があるかな。
976 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 06:39:00.31 ID:NFzuGiE50.net] 「チョムスキー階層」でググれ
977 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 07:23:17.08 ID:NFzuGiE50.net] >>958 >ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 非決定性有限オートマトンは決定性有限オートマトンに変換できるので、 バックトラックが一切起こらない形に書き換えることは可能。 lexなんかだと、そのような変換を行ったコードを生成していたはず。 ただし、プログラム言語などで一般的に使われる正規表現は、 ここでいう正規言語を拡張したものなので、この限りではない。
978 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:40:51.51 ID:QeiOUUJtx.net] C++のプロジェクトに戻りたい。
979 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:06:46.17 ID:5yPMgLrz0.net] どうぞどうぞ
980 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:56:01.32 ID:h8NdPAUM0.net] もう次スレ要らないのでは
981 名前: mailto:sage [2017/11/23(木) 19:03:52.53 ID:fGVRHt7J0.net] またまた低レベルな質問で恐縮しております。よろしくお願いいたします。 https://ideone.com/MXvhkC ここまで実装できている状態で、演算子 += を定義するには、どのように書けばいいでしょうか? なお実際に作業している対象は自作の多桁長演算ライブラリで、operator+=() を operator=() や operator+() を再利用できればうれしいな、と考えております。 operator+() や operator=() に書いていることを、繰り返して書くのは避けたいと考えているのです。
982 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:07:30.71 ID:IGgCkWwq0.net] 普通はoperator+=()を実装してから、それを使ってoperator+を実装する
983 名前: mailto:sage [2017/11/23(木) 19:44:55.34 ID:fGVRHt7J0.net] >>965 なるほど https://ideone.com/t89oo1 しかし、+=, -= ならまだしも、 *=, /=, %= を考えると、なんだか似たようなコードを二箇所に書きそうな雰囲気がします…
984 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:54:00.12 ID:IGgCkWwq0.net] だからboostにこんなのがあったりする https://boostjp.github.io/tips/operators.html
985 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:56:33.11 ID:5nCr5Wf60.net] CRTP使って自動実装
986 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:01:00.33 ID:fj1LdTry0.net] >>964 なんで friend がついてんの?
987 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 20:17:56.76 ID:j5z8beti0.net] >>967 これってなんでprivate継承なのか分からない
988 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:23:32.48 ID:fj1LdTry0.net] >>970 スライシングを起こさないようにじゃないの。 デストラクタを virtual にすると要らん仮想関数テーブルが作られちゃうからな。 それでいて定義する関数は friend 関数にしてるから外側からでも見えるんだな。
989 名前: mailto:sage [2017/11/23(木) 20:46:50.20 ID:fGVRHt7J0.net] >>969 こんな小題でもいろいろと試されるんですね… たしかに operator+=() は、意味からいっても friend である必要はまったくないですね。 一方 operator==(), operator+() は式の表現としての対象性を保存したいので、friend をつけたいと考えています。 operator<<() に対しては friend を必ずつけないといけないようですが、その理由はよくわかっていません。 https://ideone.com/pR0EP1
990 名前:デフォルトの名無しさん [2017/11/23(木) 22:59:38.32 ID:vKpvx9Uha.net] IDE使っていて思うのがtemplate関数でデフォルト引数classAを設定すれば、 template<typename T=classA> void Test(T tmp){ tmp.func(1, 2, 3); } 上記のtmp.のところでclassAの関数とかが出て来るようになると嬉しいとか思ったり コンセプトとかで対応できるようになるんでしょうか?
991 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 23:16:02.95 ID:WYrOiD8s0.net] mix-inもまともに知らないやつがなぜ回答してるのか…
992 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 00:17:10.75 ID:mELw8YtS0.net] >>973 言語仕様っていうよりIDEの性能のような。 コンセプトまで構文解析してサジェストするようになれば確かにできるかもしれんけど。
993 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:03:21.71 ID:/7rxT1Yr0.net] >>973 技術的には可能だからlibclangでなんとかなるようになるなら誰かやってくれるかもね コード補完にプラグインを使えないIDEなら開発元にリクエストするしかない
994 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:39:31.39 ID:Z3szivMI0.net] mix-inで理解が止まっている人がなんか吼えてますな
995 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 08:42:41.97 ID:ZeExn92sr.net] >>973 コンセプトはシンタックスの誤りを判定するのみで型情報を持っていないため その補完は期待できない
996 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 09:00:16.20 ID:nFkUcp0I0.net] >>977 boost operatorsのprivate継承がmix-in以外のなんだと思ってるんだ?
997 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:03:13.88 ID:dhAYmdbT0.net] 静的リフレクションが欲しい
998 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:21:33.74 ID:Un7I7rhA0.net] 後のプリプロセッサである
999 名前:デフォルトの名無しさん [2017/11/24(金) 12:38:49.19 ID:p8RxfMqqa.net] C++を勉強しようとしてるんだが 基本的にCの書き方が一般なのか C++の書き方が一般なのか教えてもらいたい
1000 名前:デフォルトの名無しさん [2017/11/24(金) 12:51:25.91 ID:l1+FhW7v0.net] コーディングスタイル? そんなの好きにすればいいよ
1001 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 13:21:28.52 ID:w0OmJEj50.net] >>982 Cの書き方とかC++の書き方とか一般的とかない 「一般的」なるものを求めたいならメジャーなIDEのデフォルトのオートフォーマットだろうな
1002 名前: mailto:sage [2017/11/24(金) 13:44:06.80 ID:ZNkp8uW60.net] >>964 結局こうなりました https://ideone.com/SUSTBj
1003 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:07:55.96 ID:lG8HVUMw0.net] >>985 operator+= の返却値は参照にしといた方が辻褄が合うので良いよ
1004 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:10:30.10 ID:/RqU0h4Pd.net] 関数内で作ったベクターやマップは関数を抜けたらメモリ解放されると考えてよかです?
1005 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:13:40.22 ID:lG8HVUMw0.net] >>987 記憶クラスによる。
1006 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:25:57.62 ID:/RqU0h4Pd.net] >>988 記憶クラスによるとは スマホで打ってるから書式とかガタガタだけど下みたいなことしてる createmapってのを抜けたときにvectorもmapも解放されると信じている vector XX( *map) { 要素数二個のstring型のvectorデータを作成 return vector<string> ←要素数2 } createmap () { map<string,string> y { vector<string> tmp = XX(&y) y.insert( tmp[1] , tmp[2]) } }
1007 名前:デフォルトの名無しさん [2017/11/24(金) 14:36:50.33 ID:9/UAKu4i0.net] うん、信じていい XXから抜けるときにムーブコンストラクタでtmpへ移動され createmapから抜けるときに解放される このときoperator deleteが呼び出されるが operator deleteがどのようなタイミングで解放しているかには依存すべきでない 我々が関心を持つべきはoperator deleteが呼び出されるタイミングで実装の詳細ではない
1008 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 15:15:03.03 ID:lG8HVUMw0.net] >>989 static 付きで宣言してればプログラムの終わりに解体されるし、 new で作れば delete されたときが解体されるし、 そうでなければスコープの終わりに解体される。 「関数内で作った」というだけでは情報不足。 >>989 のような例であればスコープの終わりで解体されることは保証される。 それと >>990 はムーブコンストラクタの話を出してるけど C++17 以降ではこういう場合は RVO の発動が必須になってなかったっけ?
1009 名前:デフォルトの名無しさん [2017/11/24(金) 15:33:02.71 ID:9/UAKu4i0.net] >>991 990だが、何を言っているのか、悪いがよくわからん XXがcreatemapとは別の翻訳単位から外部結合されている場合でも その何だ、ムーブコンストラクタの回避(?)が必須になったのか?
1010 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:06:58.81 ID:lG8HVUMw0.net] >>992 そう。 RVO 必須だからコピーコンストラクタもムーブコンストラクタも無いクラスでも OK っていう新しいルール。 https://wandbox.org/permlink/X6g7JSpkSl82VvtZ
1011 名前:デフォルトの名無しさん [2017/11/24(金) 16:44:55.52 ID:9/UAKu4i0.net] >>993 OK? それは03でも同じことやん
1012 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:48:44.24 ID:lG8HVUMw0.net] >>994 いや >>993 みたいなのは C++14 以前では NG になるよ。
1013 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:54:03.03 ID:WoNXR2ax0.net] C++相談室 part133 mevius.5ch.net/test/read.cgi/tech/1511509970/
1014 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:58:12.64 ID:jkTO/gHT0.net] 乙。
1015 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:04:12.57 ID:BCw6/Ft50.net] 彼。
1016 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:25.34 ID:lG8HVUMw0.net] >>999 なら長門有希は俺の嫁
1017 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:54.81 ID:lG8HVUMw0.net] >>1000 なら双葉杏も俺の嫁
1018 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 45日 16時間 56分 20秒
1019 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています