1 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 11:35:36.76 ID:4wggfTwe.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part145 mevius.5ch.net/test/read.cgi/tech/1568362404/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語)
771 名前:デフォルトの名無しさん [2019/12/10(火) 00:04:16.84 ID:KeuWZv5z.net] https://ja.cppreference.com/w/cpp/container/list/list 僕はいつもここを見ます。
772 名前:デフォルトの名無しさん [2019/12/10(火) 00:06:34.29 ID:KeuWZv5z.net] std::swapの特殊化がnoexceptです。 これを使いますか。
773 名前:デフォルトの名無しさん [2019/12/10(火) 00:08:47.32 ID:KeuWZv5z.net] 引数無しのコンストラクタがnoexceptじゃないから無理でした。
774 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 00:37:17 ID:OASxW0Hh.net] そもそも noexcept にする必要性が不明だし、呼び出してる関数が 全部 noexcept じゃなくても std::list 実装を限定してよかったり、特定実装での bad_alloc =即死の不都合が必要性と釣り合うなら noexcept にすることはできるし、 最大限の移植性も bad_alloc の通知も noexcept もすべて本当に必要なら >755 でポインタって答えも出てるのに。
775 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 00:41:00 ID:2YzAsKi1.net] 自動でnoexceptに成らないなら、自分で望みのnoexceptの定義すりゃ良いだろうに 部品が例外投げるなら内部でcatchして適切に処理すればいい
776 名前:デフォルトの名無しさん [2019/12/10(火) 00:43:28.28 ID:KeuWZv5z.net] https://github.com/isocpp/CppCoreGuidelines これです。
777 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 07:32:12 ID:Xhvd8FYl.net] >>761 正論
778 名前:デフォルトの名無しさん mailto:sage [2019/12/10(火) 19:05:35.05 ID:yM6al2d7.net] 途中でcコード通るとか何らかの理由があるんだろう。
779 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:14:22.35 ID:KfdgnhFC.net] ある一つの変数に対してstd::threadで作成したプロセスは値を更新し続けて、メイン関数の方では値を読み続ける場合は排他処理する必要はありませんか? メイン関数の方は必要なときだけ値が読めればいいので読みこぼしは無視していいです
780 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:19:53.65 ID:iOg65oSz.net] >>765 変数が std::atomic<T> でなければ排他制御の必要があります。
781 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:21:20.19 ID:m9WEF2SZ.net] >>765 atomicでないとだめ。プリミティブな型でもあやしい。 りーどらいとろっくするがよい。
782 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:23:21.98 ID:/1t9T7AP.net] 基本型かつ確実にレジスタでなくメモリに書き出されているならそうだね std::atomcを使うのが無難 その条件ならmemory_order_relaxedを指定すればバリアのオーバーヘッドは避けられる 面倒だけどね
783 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:35:45.33 ID:IATqHbi6.net] 質問者じゃないけど 読みこぼしとかタイミングによるズレが問題ないとしても排他制御なしに読み書きする時点で未定義動作だからNG って認識でおk?
784 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 13:46:34.56 ID:iOg65oSz.net] はい。 https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-20 > The execution of a program contains a data race if it contains two > potentially concurrent conflicting actions, at least one of which is > not atomic, and neither happens before the other, except for the > special case for signal handlers described below. Any such data race > results in undefined behavior.
785 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 14:00:16.36 ID:/1t9T7AP.net] 言語仕様はそうだろうけど x86なら実際は多くの場合バリア不要だったりするから 最終的にどういうinstructionになっているのか知っておくと理解が深まる
786 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 15:24:29 ID:nkoUZIKM.net] x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ これ以外だったり同期が必要なければ 排他制御は不要 もちろん、 一連のデータリード
787 名前:ナデータの一貫性が必要であれば一貫性確認の仕組みなり排他制御なりは当然必要だし、 コンパイラが読み書きを省略する可能性のあるコードであれば volatileを付けるなど、省略を防ぐ必要はある ymmレジスタを使えばアトミックな読み書きが出来るので 256bit以内なら一貫性も保てる マルチコアARMの場合は DMB命令を入れておけば確実 パフォーマンスに問題が無い箇所であれば、 移植性の為にも、素直にC++の排他制御を入れておこう! [] [ここ壊れてます]
788 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 15:42:23 ID:ax9A/ZTc.net] お前らRustに移行とか考えたりするの?
789 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 17:37:57.91 ID:bM/oaPHs.net] >>773 個人的には絶対に移行したくないと思っている。
790 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 17:42:08.10 ID:/1t9T7AP.net] どっちもやったらええがな
791 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:13:18.74 ID:bM/oaPHs.net] >>771 質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、 物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。 一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が あるため。 もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、 僅かにタイミングがずれることで、「すれ違い」現象の様なことが おきることがある。これが起きると、変数の値をフラグ的に利用して 厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。 これを避けるには、80386の設計者は、XOR交換命令を使うことを想定 していたらしい。 2つのスレッドでデータをやり取りする場合には色々と注意が必要で、 普通はデータが準備できたかどうかをCreateEvent(),SetEvent(), WaitForSingleEvent()などで待機して処理するのが基本。
792 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:17:08.59 ID:bM/oaPHs.net] >>776 スマン。XOR交換命令ではなく、xchg命令だった。
793 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:20:46.73 ID:NtLrnXCf.net] goよりかはrustの方が全然マシやと思うぞ 最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ〜
794 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:30:30.06 ID:/1t9T7AP.net] >>776 xchgはsequential consistencyが必要な場合だよ 今回のように単にatomicにread/writeできればいいだけなら不要 お前さんも含めてよくわからん人は使わないのは正解
795 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:36:33.88 ID:bM/oaPHs.net] >>779 正直言って、俺は、lock, xchg, mfence, prefetch, キャッシュ制御付き(?)mov各種(大量) に付いてはちゃんと理解出来てないことは認める。
796 名前:デフォルトの名無しさん [2019/12/11(水) 18:38:56.23 ID:bM/oaPHs.net] MFENCE PREFETCH MOVNTDQA LFENCE(?) XCHG LOCK prefix WC Memory ↑沢山あるけど、よく分からない。 xchgもちゃんと理解できてない。
797 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:39:59.12 ID:bM/oaPHs.net] MFENCE, LFENCE, SFENCE。 服のサイズみたいだ。分からん。
798 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 18:46:12.74 ID:bM/oaPHs.net] >>779 xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に 1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための ためのようですね。今回とは余り関係ないようです。
799 名前:デフォルトの名無しさん mailto:sage [2019/12/11(水) 21:50:49.53 ID:10jfhd7e.net] >>777 XORを使った交換テクニックがあったのを思い出した
800 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 00:31:42.87 ID:n5d2iAqE.net] >>765 その場合でも排他制御は基本的には必要。 たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。 別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
801 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 00:36:46.28 ID:n5d2iAqE.net] >>765 あとはアレだな、変数の構造にもよるけど、変数を読み込んでる最中に、上位ワードを読み込んだ後に値が変わって下位ワードだけ新しくなるなんてことも 可能性としては0とは言えない。
802 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 00:54:16 ID:UvCIGzud.net] AVXを使えば256bitを1命令で AVX512を使えば512bitを1命令で 読み書き可能
803 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 01:00:12 ID:UvCIGzud.net] x86系だとCMPXCHG命令 ARMだとLL, AC命令 がデータの一貫性確認に使える
804 名前:デフォルトの名無しさん [2019/12/12(Thu) 03:03:25 ID:hmkgwwLY.net] とんちプログラミングはもう流行らなさそう。
805 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 03:28:17.88 ID:J/GuvI9A.net] とんちプログラミングwww
806 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 03:55:57 ID:g+q4RhTJ.net] > これを避けるには、80386の設計者は、XOR交換命令を使うことを想定 > していたらしい。 当たり前じゃね?アトミックな命令を使うのは基本だと思うが
807 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 07:30:46.73 ID:UvCIGzud.net] XOR
808 名前:デフォルトの名無しさん mailto:sage [2019/12/12(Thu) 07:43:20 ID:Vt8W+oPZ.net] xor rax,rbx xor rbx,rax xor rax,rbx これでswap rax,rbx相当ってことね
809 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 07:53:00.21 ID:UvCIGzud.net] >>777
810 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 10:43:59.85 ID:r0VN1UlG.net] condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?
811 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 10:56:19.34 ID:WJA8YZFG.net] 時空が逆流し、針の先から悪魔が生まれる
812 名前:デフォルトの名無しさん [2019/12/12(木) 11:06:56.29 ID:a67Hqgb2.net] jsに対するTypeScriptみたいな感じで C++に対するRustっていう認識は間違ってるが それならC++に対するそれは何が適当なんかある?
813 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 11:10:12.33 ID:Vt8W+oPZ.net] allに該当する要素の数が0なのを特別視する必要はなさそう
814 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 11:21:14.68 ID:NrsugUJv.net] 非同期な操作やしその瞬間何も起きんなら単にスルーするだけ
815 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 12:01:38.93 ID:Z8SHCwDj.net] >>797 無い。
816 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 12:26:43.11 ID:gL/Y8Ccu.net] >>797 Managed C++とかC++/CLIとか
817 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 13:04:34.98 ID:Z8SHCwDj.net] >>801 それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
818 名前:デフォルトの名無しさん [2019/12/12(木) 13:08:42.86 ID:b3wcvAqB.net] C++は型安全だからC++はC++
819 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 14:17:55.83 ID:CNmkwPhj.net] 型安全認定された!
820 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 14:59:18.45 ID:ZWrMIDdu.net] ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
821 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 16:27:22.69 ID:AVYkL4QT.net] JSが危険ってどういう事? C/C++は型がない=危険だけど JSなんかは型安全な言語だからちゃんと例外になって、 メモリ保護エラーとか起こすこと無いけど?
822 名前:デフォルトの名無しさん [2019/12/12(木) 16:39:21.91 ID:hmkgwwLY.net] Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?
823 名前:デフォルトの名無しさん [2019/12/12(木) 16:47:21.68 ID:hmkgwwLY.net] C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?
824 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 18:38:14.77 ID:Ijd1d2r8.net] 毎回フルスキャンしたいならどうぞ
825 名前:デフォルトの名無しさん [2019/12/12(木) 18:59:14.59 ID:hmkgwwLY.net] ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。
826 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:07:50.30 ID:Z8SHCwDj.net] >>806 型も宣言も無い事が危険になることが多い。 例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列 を指定してしまっても処理系がエラーを出してくれない。関数を修正して 仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。 この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。 Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。 また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、 グローバル変数にいれたつもりがローカル変数になってしまっていることがある。 また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数 が使用されたと解釈されてしまう。 どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
827 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:25:03.70 ID:AVYkL4QT.net] >>811 お前が型安全の意味を間違ってるってことはよく分かった。 メモリ保護エラーなど言語で解決されないエラー (OSがトラップするエラー)になってしまうことを 型安全じゃないっていうんだよ 言語で例外になるならそれは型安全
828 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 19:44:50.53 ID:Vt8W+oPZ.net] ぬるぽ
829 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 20:29:23.98 ID:f2lx0DlC.net] ツンッ
830 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 20:46:51.94 ID:6QhfdrtV.net] >>808 おそらくできると思う
831 名前:デフォルトの名無しさん [2019/12/12(木) 22:31:55.78 ID:hmkgwwLY.net] boost.property_treeはノードはコンテナだって書いてる。 アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
832 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 22:36:00.00 ID:2qfVB5NM.net] >>812 ??? >>811 は型安全なんて一言も言ってないけど?
833 名前:デフォルトの名無しさん [2019/12/12(木) 22:37:04.02 ID:hmkgwwLY.net] 仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。 これはちょっとまずい。 ある部分木の途中からある部分木の途中までを注目することはよくあるから。
834 名前:デフォルトの名無しさん [2019/12/12(木) 22:45:48.06 ID:hmkgwwLY.net] ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。 これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
835 名前:デフォルトの名無しさん [2019/12/12(木) 22:52:26.39 ID:hmkgwwLY.net] 考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。
836 名前:デフォルトの名無しさん [2019/12/12(木) 22:59:41.49 ID:hmkgwwLY.net] つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。
837 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 23:02:50.75 ID:+RpJiFi7.net] jsてのは女子小学生の意味か?
838 名前:デフォルトの名無しさん [2019/12/12(木) 23:04:10.87 ID:hmkgwwLY.net] 型が無いと僕たちには辛すぎるよね。 ミスを発見してくれないから。
839 名前:デフォルトの名無しさん mailto:sage [2019/12/12(木) 23:36:51.22 ID:Rc7qy7fw.net] 型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
840 名前:デフォルトの名無しさん [2019/12/13(金) 00:21:19.32 ID:0IHjBlJG.net] 型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。 呼び出し側が責任を持つということになるのかも。
841 名前:デフォルトの名無しさん [2019/12/13(金) 00:22:24.50 ID:0IHjBlJG.net] 型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
842 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 06:47:47.05 ID:6WB0hlYg.net] >>824 むしろ(静的)型なんて俺には不要だぜ、ベイビーって奴の方がアホっぽいけどなw >>825-826 静的型付け 動的型付け あたりでググってこい
843 名前:デフォルトの名無しさん [2019/12/13(金) 07:17:35.68 ID:0IHjBlJG.net] 機械語は変数に型がない。 命令で型を使い分ける。 その大変さを考えると型欲しいってなるのかも。
844 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 07:24:37.08 ID:Ry/2QtNy.net] まさにBがCに進化するときの考え方だね
845 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 09:49:21.00 ID:wVkcEFxk.net] >>825 ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数 用意して使うと言う発想はスクリプト言語的な発想。 そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には 分からない事が多いので安全性を損なう場合が多い。 スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと するが、それが思わぬ間違いを含みがち。 C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる ことで、「大体の動作」は好まれない。
846 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 09:53:03.46 ID:wVkcEFxk.net] >>826 型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に なって STL (template) で流行りだしたもの。 もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して エラーを出してくれるようにするためだった。C言語には関数の多態性(overload) がない。なお、override と overload は別の概念なので、知らない人は検索して 欲しい。
847 名前:デフォルトの名無しさん [2019/12/13(金) 09:53:50.44 ID:0IHjBlJG.net] イネーブラ使えば良いのでは。
848 名前:デフォルトの名無しさん [2019/12/13(金) 10:00:20.89 ID:0IHjBlJG.net] コンセプトコイコイって感じなのかな。
849 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 11:27:07.79 ID:WVlIRY9+.net] #pragma omp parallel forで 自動分割され、各スレッドに割り当てられた ループの開始点と終了点を取得することできませんか?
850 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:09:24.89 ID:e6j7CnOm.net] >C言語には関数の多態性(overload)がない さらりと嘘をつくやつがおるな
851 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:27:30.70 ID:fi1/rC5j.net] 今UE4と組み込み以外でc++の仕事あります?
852 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:33:53.16 ID:xTSwswyu.net] オーバーロードあるか? ディスパッチの方法はいろいろあると思うが
853 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 18:55:58.62 ID:ftjAwgQI.net] >>836 USのマイクロソフトに行け
854 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 19:01:03.38 ID:ysGzQi5M.net] >>830 > ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数 > 用意して使うと言う発想はスクリプト言語的な発想。 え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ? 「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
855 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 19:52:22.32 ID:6WB0hlYg.net] >>839 > え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ? 関数は無理だがメソッドでいいならPowerShell
856 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 20:00:57.46 ID:ysGzQi5M.net] PowrShell は型付言語ですからね。 それぐらいでしょ?
857 名前:はちみつ餃子 mailto:sage [2019/12/13(金) 20:54:52.57 ID:1q9LzdDI.net] 用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
858 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:07:31.92 ID:KHLl2/ku.net] >>841 うん、1つあれば > え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ? の反例になるからね
859 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:09:15.79 ID:wKYhuojH.net] >>843 そしたら、一つぐらいしか無いって俺は意見を訂正するだけなんだが、 お前も同じ関数名の関数を複数用意できるのはスクリプト言語では PowerShellだけだって訂正するって話でいいの?
860 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:13:12.55 ID:gmdEaqRD.net] それでいいんじゃないの
861 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:23:18.13 ID:T1rtAOWF.net] 質問です template <typename T> constexpr inline T value; template <typename T> constexpr inline T value = (T)0; こうやって変数テンプレートの宣言と初期化を分
862 名前:離すると VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません 本来どっちの動作が正しいんでしょうか? [] [ここ壊れてます]
863 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 21:37:57.11 ID:KHLl2/ku.net] >>844 別にそれでいいよ > え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ? が無知からの発言と認めてもらえればいいだけだしw
864 名前:デフォルトの名無しさん [2019/12/13(金) 22:26:34.23 ID:0IHjBlJG.net] >>846 これも通ってしまった。 #include <iostream> template <typename T> constexpr T value = 1; template <typename T> constexpr T value = 2; template <typename T> constexpr T value = 3; template <typename T> constexpr T value = 4; template <typename T> constexpr T value = 5; template <typename T> constexpr T value = 6; int main() { std::cout << value<int> << std::endl; }
865 名前:デフォルトの名無しさん [2019/12/13(金) 22:27:26.74 ID:0IHjBlJG.net] 実行結果。 Start 6 0 Finish 最後の定義が有効になってるように見える。
866 名前:デフォルトの名無しさん [2019/12/13(金) 22:28:16.14 ID:0IHjBlJG.net] Wandbox C++ gcc HEAD 10.0.0 2019
867 名前:デフォルトの名無しさん mailto:sage [2019/12/13(金) 22:54:36.18 ID:T1rtAOWF.net] ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・ 宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
868 名前:デフォルトの名無しさん [2019/12/13(金) 22:57:06.09 ID:0IHjBlJG.net] 僕もちょっとわからないんだけど。
869 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 00:21:27.14 ID:stptR0oK.net] >>836 デスクトップアプリ
870 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 07:31:10.87 ID:SZLGcxYz.net] >>846 診断メッセージをよく見ろよ > error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。 そもそも分離できないんだよ いいか、constexprは翻訳時定数だぞ それを翻訳段階9まで未解決のままにできると思うか?
871 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 08:56:55.09 ID:fBoJLlft.net] >>854 なんでできるようにしないの? そっちの方がおかしくね?
872 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 09:02:00.44 ID:SZLGcxYz.net] なんでという理由も述べたはずだが
873 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 09:53:01.66 ID:fBoJLlft.net] >>856 だからそれを可能にするようにしてくれ
874 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:02:03.90 ID:SZLGcxYz.net] ん? 俺は江添じゃねえぞ 奴なら標準会員だから言ってみるのもいいが
875 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:02:27.48 ID:SZLGcxYz.net] - 標準会員 + 標準化委員
876 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:08:29.00 ID:yV/FURvf.net] 江添本ダメ絶対
877 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 10:30:50.58 ID:stptR0oK.net] 江添でもできない
878 名前:846 mailto:sage [2019/12/14(土) 10:35:10.86 ID:QUVSvjZy.net] >>854 >診断メッセージをよく見ろよ 見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ >いいか、constexprは翻訳時定数だぞ それ以前にテンプレートなんですが
879 名前:デフォルトの名無しさん [2019/12/14(土) 12:26:05.30 ID:m0rD8Ode.net] ローマ法王は根競べで決めるらしいですよ奥さん。
880 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:26:49.81 ID:gw9aL+td.net] 誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
881 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:35:13.30 ID:SZLGcxYz.net] >>862 なんかとんがってんな コンパイラのバグとまで言う根拠は何だ? 相場では規格票の条文だが テンプレートなのは見ればわかるさ だから何なのか説明をやめないでくれ
882 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 12:50:37.99 ID:gw9aL+td.net] >相場では規格票の条文 通産省の癖の抜けない老人はご退場いただきたい
883 名前:デフォルトの名無しさん [2019/12/14(土) 12:58:43.25 ID:m0rD8Ode.net] これODRの緩和と関係あるんですかね?
884 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:34:08.27 ID:T/HCOnVQ.net] >>772 >x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ 別に。 コアAの読み書きをコアA自身が見る分にはそうかもわからんが コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る (アウトオブオーダー実行の影響で 安全に動かすには適切にメモリバリアで順序化する必要がある
885 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:37:18.74 ID:JwYnIOEa.net] >>868 read ==> read read ==> write は入れ替わらない
886 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:37:51.96 ID:T/HCOnVQ.net] といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
887 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:38:24.93 ID:T/HCOnVQ.net] >>869 迷信
888 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:39:11.91 ID:JwYnIOEa.net] ソースは?
889 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:39:40.59 ID:T/HCOnVQ.net] リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため そのような保証は無い
890 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:41:05.07 ID:JwYnIOEa.net] それのソース
891 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 13:44:15.66 ID:JwYnIOEa.net] https://github.com/herumi/misc/blob/master/cpp/fence.md
892 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:15:12.84 ID:JwYnIOEa.net] x86系は シングルコアのマルチスレッドアプリ の多くがそのまま動くように出来てる シングルコア時代が長かったから
893 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:55:10.15 ID:QUVSvjZy.net] >>865 >テンプレートなのは見ればわかるさ >だから何なのか 普通に考えて、実体化がまだなのに定義(初期化)を強制される妥当な理由はない、ということ
894 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 14:57:30.67 ID:T/HCOnVQ.net] 確かにリンク先のインテルのマニュアルの >8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations >Example 8-2. Stores Are Not Reordered with Older Loads に >Initially x = y = 0r1 = 1 and r2 = 1 is not allowed と書いてあって>>875 と同じことが書いてあるが疑わしい マニュアルが間違っているのではないか、 ちな >8byteのデータはアドレスが8の倍数のときにアライメントされている。 から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい >8.1.1 Guaranteed Atomic Operations を見たらワカル、
895 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:04:35.33 ID:T/HCOnVQ.net] つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」 旨が2箇所ぐらいに書かれているが、 ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、 これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、 マニュアル執筆者の国語の再教育が必要なのではないか
896 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:10:49.52 ID:SZLGcxYz.net] >>877 おまえさん、もしかして テンプレートの宣言と定義と オブジェクトの宣言と定義を ごっちゃにしてないか? int test; int test = 5; これは宣言と定義じゃなく定義の重複だぞ
897 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:13:40.23 ID:PwUHvw+y.net] お前なぁ x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
898 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:20:09.00 ID:T/HCOnVQ.net] そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、 >>879 の投機的実行の件はどうなんじゃ? あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
899 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:21:14.95 ID:k5kIl1RN.net] >>877 × 普通に考えて 〇 俺の頭の中で × 妥当な理由はない 〇 妥当な理由は思い当たらない テンプレートなら初期化は不要という主張なら、 constexpr 変数の宣言と定義を
900 名前:分離できないことは納得してるのかな? そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの? 特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、 明確が意義がなければ特別ルールは無いのが妥当だと思うよ。 [] [ここ壊れてます]
901 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:24:42.79 ID:QUVSvjZy.net] >>880 , >>883 マウント取るのが最優先でまともな回答できない(するつもりも無い)んなら黙っててくれ >これは宣言と定義じゃなく定義の重複だぞ externつけたら? >それをテンプレートの時だけ可能とすることに意義があると思うの? テンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる さて、 >× 普通に考えて >〇 俺の頭の中で >× 妥当な理由はない >〇 妥当な理由は思い当たらない こんなゴミみたいな煽り入れてきたからには逃げるなよ
902 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:32:39.86 ID:SZLGcxYz.net] >>884 おまえさんの元の質問はこうだったな template <typename T> constexpr inline T value; template <typename T> constexpr inline T value = (T)0; どこにexternなんて書いてある? マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ こっちはそんなこと微塵も考えちゃいねえよ失敬な 最初の口調に戻れよ
903 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:36:57.55 ID:QUVSvjZy.net] 間違えた Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる ○初期化に使われる定数式の評価を遅らせられる 言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には それに使う定数式内のすべての型が完全型であることを強制されてしまう =std::is_integral_v = std::is_integral<T>::valueでいえば is_integral構造体の方が取り回しがいい、ということ なんのために変数テンプレートが導入されたのか・・・・
904 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:37:56.58 ID:QUVSvjZy.net] >>885 自分が失敬だからこうなってるとは考えられないんだな 何様だよ、そもそも質問に答えてないだろうが
905 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:43:43.09 ID:SZLGcxYz.net] >>887 template <typename T> constexpr inline T value; template <typename T> constexpr inline T value = (T)0; を例示しての質問に対して int test; int test = 5; という答えをしているぞ valueがtestになったのは悪かったが 余計な飾りをとって問題の核心を指摘したんだよ
906 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:48:43.77 ID:SZLGcxYz.net] 家事があるんでしばらく離席する
907 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 15:58:10.05 ID:QUVSvjZy.net] 規格でそうなってる(テンプレートゆえの特例は無い)のが”わかってるなら” 最初からそう言ってくれれば済むんじゃないの? >>854 を読み直せよ、テンプレートのことが完全にすっぽぬけた上に失礼な回答だろ >コンパイラのバグとまで言う根拠は何だ? とまで、って・・・・普通にありえるだろ、動作が違うんだから(未定義とかいう屁理屈は無しで) で、>>883 は逃げたの?
908 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 16:55:24.17 ID:k5kIl1RN.net] >>886 やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、 何ができるようになるのか、が見えてこない。ごめんね。 宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、 それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに 宣言と定義は分けられるし。 ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、 宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。 「記述を遅らせられる」の間違い?
909 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:16:54.80 ID:SZLGcxYz.net] だめだこいつ 絶望的に人に者を尋ねる態度がわかってない 「言ってくれれば済む」とか図々しすぎ 技術的な議論がしたいがこいつ相手では 不必要にイラついちまって無理だわ 俺そんなに人間できてない
910 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:24:00.92 ID:QUVSvjZy.net] >>891 すまん、 >テンプレート実体化までテンプレート引数依存箇所の評価はされない これ検証してみたらたしかにそうだった 手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた (おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい 多分構造体か何かでワンクッション置けば解決できると思う) これなら確かに分けられなくて問題無いね >>892 >いいか、constexprは翻訳時定数だぞ >それを翻訳段階9まで未解決のままにできると思うか? >なんかとんがってんな >後出しなんかしてるのはそっちだ >余計な飾りをとって問題の核心を指摘したんだよ さらには >最初の口調に戻れよ の上で >技術的な議論がしたいがこいつ相手では >不必要にイラついちまって無理だわ よくそんなセリフが言えたもんだ 自己評価高すぎじゃない?wwww
911 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:52:18.36 ID:SZLGcxYz.net] 意見が合うとか合わないとか以前の問題 根底的なメンタリティに欠陥がある相手とは話にならない
912 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 17:58:45.99 ID:k5kIl1RN.net] FYI >>846 Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68012 >>848 One definition rule https://timsong-cpp.github.io/cppwp/n4659/basic.def.odr#1 > No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
913 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 18:08:23.02 ID:QUVSvjZy.net] >>895 わざわざありがとう、やっぱgccのバグだったのね
914 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 19:50:50.54 ID:UskLmxJI.net] GCCに踊らされてスレを浪費した
915 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 20:04:04.94 ID:4qfYuBec.net] >>837 オーバーロード=多態性じゃないんで… オーバーライドのことなら当然cで実現できる
916 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:11:37.22 ID:zf7JKoX1.net] >>898 どうやって? いや、ディスパッチの方法はいろいろあると思うが
917 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:15:53.72 ID:SZLGcxYz.net] 禿もそんなことを言いながら virtualの導入には当初反対から出発したんだよな
918 名前:デフォルトの名無しさん mailto:sage [2019/12/14(土) 21:26:53.87 ID:00Pm6Tju.net] >>899 その話題QZ相手にやったばかりなんで自分で調べて
919 名前:デフォルトの名無しさん [2019/12/15(日) 09:10:03.56 ID:LATD77rz.net] 君が忘れた腕時計見つめながら。
920 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 10:29:35 ID:ir8W/KPm.net] >>898 overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。
921 名前:デフォルトの名無しさん [2019/12/15(日) 10:52:20.53 ID:LATD77rz.net] ツリーのイテレータがあるとして、イテレータが返すのはノードじゃなくて、ノードの持つ値ですよね? すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね? begin().parent()とか。
922 名前:デフォルトの名無しさん [2019/12/15(日) 10:59:28.89 ID:LATD77rz.net] イテレータが返すじゃなくて、イテレータの逆参照が返すかな。
923 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:08:51.65 ID:fGq+HT2S.net] コレクションとしては子孫ノード全部を列挙できればよくて、ツリー構造に沿った操作が行いたいなら それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。
924 名前:デフォルトの名無しさん [2019/12/15(日) 11:17:54.16 ID:LATD77rz.net] 何が子ノードのみを列挙するイテレータを返すかがよくわからない。 ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。 これは意味論的にちょっと違うかなって。 コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。 たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。 というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。
925 名前:デフォルトの名無しさん [2019/12/15(日) 11:22:50.93 ID:LATD77rz.net] 子ノードを指すイテレータの逆参照が子ノードを返すとすると、*node.begin()は子ノードを返す。 **node.begin()は最初の子ノードの
926 名前:値を返すことになるんだけども。 イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。 [] [ここ壊れてます]
927 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:23:28.40 ID:Q+saMC6e.net] >>903 こらこらoverloadは多態じゃない多重定義だ 多態はpolymorphism間違えるな
928 名前:デフォルトの名無しさん [2019/12/15(日) 11:27:25.99 ID:LATD77rz.net] イテレータは演算子の実装を求められてるわけではなく、その演算子を呼び出した時の効果を求められてるだけなので、++(int)はスタックをコピーしない方法を考えた。
929 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:30:57.88 ID:fGq+HT2S.net] そこは値じゃなくてノードを返すイテレータでいいんじゃね? 必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。
930 名前:デフォルトの名無しさん [2019/12/15(日) 11:31:53.05 ID:LATD77rz.net] そうなのかな?
931 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:37:55 ID:PfQY9kAx.net] まずイテレータで何を抽象化したいかを明確にしなよ ノードを意識させたいのか?
932 名前:デフォルトの名無しさん [2019/12/15(日) 11:38:38 ID:LATD77rz.net] STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。
933 名前:デフォルトの名無しさん [2019/12/15(日) 11:39:36 ID:LATD77rz.net] そこがわかんないんだよねえ。 禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
934 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:45:00 ID:mSzJWPy5.net] ツリー構造 範囲が広すぎて 汎用化すると使い勝手が悪くなるからしない ってだけかと
935 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 11:56:45.76 ID:Q+saMC6e.net] recursive_directory_iteratorとかね
936 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 12:06:14.82 ID:mSzJWPy5.net] なんでdirectory? treeでいいじゃん
937 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 12:22:05.91 ID:Q+saMC6e.net] いや立体がどうたら言ってるから じゃあrecursive_directory_iteratorを使うユーザーのコードは いちいち多重ループだの再帰だのといった処理になるのかって 思ってさ
938 名前:デフォルトの名無しさん [2019/12/15(日) 12:24:23.41 ID:LATD77rz.net] ツリーは、あるノードの親が知りたいときもあるはず。
939 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:07:24.45 ID:TeOOTcIs.net] ごちゃごちゃ考える前にイテレータの本分を決めなよ begin()からend()まで++で走らせた時にどうなってほしいの? 話はそれからだ
940 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:09:44.18 ID:MBW+LfoG.net] 一般にtreeの探索順序はアルゴリズムと深く結びついてるし、 そこ凝りだすと沼だぞ。
941 名前:デフォルトの名無しさん [2019/12/15(日) 13:09:51.26 ID:5G1zfwod.net] 関数ポインタをシリアライズしてファイルとして保存し、 ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
942 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:13:54.57 ID:nhcuVJi8.net] 関数だろうが変数だろうがポインタはただの整数値でしょ
943 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:18:39 ID:p2D9PeH2.net] >>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。
944 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:20:48 ID:hicN34V0.net] 次に(別のプロセスで)ファイルを読み込んだときに、 元の関数を同じ番地で参照できると限らんしな。 関数ポインタの配列のインデクスなら大丈夫だろうだけど。
945 名前:デフォルトの名無しさん [2019/12/15(日) 13:23:00.95 ID:LATD77rz.net] https://ja.cppreference.com/w/cpp/iterator/reverse_iterator/operator%3D これconstexprになってるけど、どういうときに定数になるんだろ? end()の時かな?
946 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:39:23 ID:2FA7t6Jx.net] C++20以降のvector/stringとか 使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
947 名前:デフォルトの名無しさん [2019/12/15(日) 13:47:38.10 ID:LATD77rz.net] どうもありがとう。
948 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 13:52:49.06 ID:ph9lwYgM.net] constexpr関数の中で使うため。
949 名前:デフォルトの名無しさん [2019/12/15(日) 14:30:37.97 ID:o9m7qUoD.net] デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか
950 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 14:34:47.01 ID:EeC59mXx.net] あえてベースの方のメソッドを呼びたいなんてことあるのかね?
951 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 14:38:17 ID:p2D9PeH2.net] >>931 https://isocpp.org/wiki/faq/virtual-functions#virtual-dtor-rationale
952 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 15:15:03.49 ID:K1ul1r/C.net] >>931 C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
953 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 15:29:48.68 ID:7Mmj/dyw.net] virtualでなかったら継承禁止にしても良かったんじゃないかとは思う
954 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 16:19:56.16 ID:AolOnHel.net] そうするとメタプログラミングに色々と支障が出たはずだし STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
955 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 16:52:10.11 ID:TkLVy9px.net] デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは どうなんだろうか
956 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 17:01:04.52 ID:ph9lwYgM.net] unique_ptr使えばvirtualにする必要無いのでは?
957 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 17:16:05.58 ID:p2D9PeH2.net] >>938 んなこたーない。 shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
958 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 18:59:53.87 ID:tmrMX5L5.net] >>937 >デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ mjk、
959 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 19:10:50.35 ID:AolOnHel.net] セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね 要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ 末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
960 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 19:29:34.24 ID:tmrMX5L5.net] >>941 >基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ mjk、
961 名前: mailto:sage [2019/12/15(日) 19:42:55.10 ID:gCPcwtH+.net] 永遠の初心者です、お願いします 1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか? 2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています… 3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか? --- 以上3点の質問は以下のプログラムを書いていて感じました お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として 篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する 等を元の篩に対して派生クラスとして記述しました https://ideone.com/YPlfsC
962 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:01:24.23 ID:01f7hQnX.net] >>943 ラムダ式の出番かな? void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
963 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:05:17.27 ID:5sPbacoo.net] エラストテネス 6n+1, 6n+5だけ保持とかってみんな考えるよね ちなみに 巨大なテーブル作成時のパフォーマンスを上げるなら キャッシュ
964 名前:ェ効くよう分割処理するのが非常に効果的 スレッド分割の為にいずれにしろ分割処理は作る事になる [] [ここ壊れてます]
965 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:07:01.24 ID:5sPbacoo.net] エラトステネス
966 名前:デフォルトの名無しさん [2019/12/15(日) 20:14:20.76 ID:mkXjftMX.net] 高分子エラストマー
967 名前:はちみつ餃子 mailto:sage [2019/12/15(日) 20:20:59.00 ID:jthcUe0A.net] >>943 初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。 初期化リストの中にそんなごちゃごちゃしたこと書きたい? ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
968 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 20:54:13.00 ID:TKBas8kS.net] >>939 親クラス(Base)のデストラクタに virtual 付けなくても... { shared_ptr<Base> obj( new Derived() ); } // ~Derived() called, then ~Base() called. ~Derived() はコールされるんですね... 確認してみて驚きました。 これができる仕組みを誰か教えてください。 スマートポインタのオブジェクトは子クラスの事何も知らないのに どうして ~Derived() のコールが可能なのでしょうか?
969 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:07:41.82 ID:2FA7t6Jx.net] >>949 いわゆるtype erasure https://blog.cryolite.net/entries/2006/01/08#p1
970 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:19:04.13 ID:TKBas8kS.net] >>950 まだ仕組みのとこまでですが理解できました。ありがとうございます。
971 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:24:07.01 ID:tmrMX5L5.net] 質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、 Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい? 1. C++だとsizeof(Foo::Bar)と書いたらおk 2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない (1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く (2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ (Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
972 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:39:08.56 ID:tmrMX5L5.net] ふとオモタがインスタンスの必要性は無くせるかもしれん Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても sizeof(((Foo*)0)->y) と書けばC言語で逝けるかもしれん… スゲー気持ち悪いコードだが、、、、
973 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:46:34.52 ID:PfQY9kAx.net] >>951 あくまでコンパイル時の型で決まるだけだから要注意 例えば class A; class B : public A; A* p = new B(); std::shared_ptr<A> a(p); これだとBのデストラクタは呼ばれない
974 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:48:17.68 ID:5sPbacoo.net] なんでそんな中途半端な機能を わざわざコストをかけて入れたんだろう
975 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:49:32.31 ID:5sPbacoo.net] やむを得ず なんだろうけど
976 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 21:51:55.29 ID:PfQY9kAx.net] >>953 Linuxカーネルとかそういう感じのマクロ満載だよ C言語はそういうもん
977 名前:デフォルトの名無しさん mailto:sage [2019/12/15(日) 22:05:12.60 ID:TeOOTcIs.net] type erasureと相性悪いんだっけ
978 名前:はちみつ餃子 mailto:sage [2019/12/15(日) 22:15:04.90 ID:jthcUe0A.net] >>943 思い出した。 gcc や clang の拡張で良ければ複文が式になる。 だいぶん昔からある機能。 #include <vector> #include <iostream> int main() { std::vector<int> foo(({int i; for(i=0; i<3; i++); i;})); std::cout << foo.size() << std::endl; return 0
979 名前:; } [] [ここ壊れてます]
980 名前: mailto:sage [2019/12/16(月) 19:39:21.34 ID:NZyGx79l.net] >>944 ,945,948,959 コメントありがとうございます! >>944 ,959 まずgcc拡張 >SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */ で問題なく動作しました すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました 次にラムダ式で定義して即評価する方法がみつかりました >SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */ これがやりたかった!とても満足しています、ありがとうございました! 今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています >>948 >初期化リストの中にそんなごちゃごちゃしたこと書きたい? クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました 一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、 複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても https://ideone.com/y3ROXS
981 名前:デフォルトの名無しさん mailto:sage [2019/12/16(月) 20:14:24.13 ID:89loOkbp.net] まあこういう自己満は通過儀礼だよな
982 名前:デフォルトの名無しさん mailto:sage [2019/12/16(月) 21:46:21.90 ID:kSgVv2yp.net] lambdaの即時評価はjsだと多用されているイメージ ブロックスコープないからね
983 名前:はちみつ餃子 mailto:sage [2019/12/17(火) 00:52:53.01 ID:0JRJucIS.net] >>960 > すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました 30 年以上の実績があってもなお仕様に入らない程度に駄目なんだよ。
984 名前:デフォルトの名無しさん [2019/12/17(火) 03:23:09 ID:JQ5aWxOy.net] プライベートメンバの単体テストってみんなどうしてるのかな。
985 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 03:30:02 ID:nsTCJN+n.net] #define private public
986 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 03:58:13.47 ID:KUtZUPl9.net] #if 0 friend test; #endif
987 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 07:08:07.08 ID:KzMqUd+t.net] #ifndef NDEBUG friend struct test; #endif
988 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 07:46:15.26 ID:wpWnXFFo.net] 闇言語
989 名前:デフォルトの名無しさん [2019/12/17(火) 11:20:07.09 ID:dc1/89bE.net] namespace Method{ namespace Detail { template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{}; } } // 文字列で呼び出すための関数を登録するためのマクロ #define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \ namespace Method { namespace Detail { \ template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \ using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \ MethodRegister() { \ MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \ } \ ~MethodRegister() { \ MethodContainer::GetInstance().Unregister( #FUNC ); \ } \ }; \ static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \ } } void HOGE(){ std::cout << "Hello World!" << std::endl; } void HOGE( std::string text ){ std::cout << text << std::endl; } METHOD_REGISTER_METHOD( HOGE, void ); METHOD_REGISTER_METHOD( HOGE, void, std::string ); こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、 関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等 多数の問題が出て詰まってしまいました。 こういった問題を対処するにはどうすればよいのでしょうか?
990 名前:デフォルトの名無しさん [2019/12/17(火) 11:28:10.65 ID:rApV4krM.net] BOOST
991 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 12:23:52.67 ID:lfJGbKnI.net] >>966 >>967 リリース時に消す必要あんの?
992 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 18:42:08.59 ID:iYSb7MEE.net] このへんがいいんでないの。 https://srz-zumix.blogspot.com/2015/06/c-private.html
993 名前: mailto:sage [2019/12/17(火) 19:10:07.01 ID:780pCLgH.net] >>963 まあ、 ({int r; while((r = index(n)) == 0) n--; r;}) の最後の r; というのが限りなく非文法的ですし
994 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:19:56.70 ID:r3fDxRx7.net] プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。 まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。
995 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:45:39.29 ID:HvtzVY9o.net] templateでアクセスすると合法的にプライベートメンバにアクセスできる
996 名前:デフォルトの名無しさん mailto:sage [2019/12/17(火) 21:49:21.80 ID:iYSb7MEE.net] そんな糞な方法でテストなんかしたくねー。
997 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 01:14:03 ID:zSYbFuJ0.net] テストなんかお綺麗にする必要が無い
998 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 06:18:11.97 ID:BbfJ/y//.net] テストのテストが必要になるような意味のわからないテストコードはアウト テストコードは実行せずに人が読んで理解できなければいけない
999 名前:デフォルトの名無しさん [2019/12/18(水) 07:25:56.60 ID:ksLRDXXy.net] >>978 どんな感じか見せていただけないでしょうか。
1000 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 07:42:51.80 ID:PEFQbiIG.net] >>971 絶対必要でもないが 少なくともデバッグ用であることくらい アピールしたい //よりNDEBUGという特定ワードを使う点にも拘りがある
1001 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 07:48:17.80 ID:uFDqtnkl.net] >>979 例えばテストコードの中にループや条件分岐があるようなものはアウト
1002 名前:デフォルトの名無しさん [2019/12/18(水) 11:33:15.65 ID:ksLRDXXy.net] ループは許してもらえませんか? データの並びとか検査したいんで。 条件分岐はたぶんないと思います。
1003 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 12:41:59.93 ID:pXzQg2xI.net] 原理主義にすぐ染まるやつw ご苦労様
1004 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:15:29.66 ID:iEIErwam.net] テスト用にいろんな複雑なテストも入れてるけど まずいのか?
1005 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:22:47.07 ID:AjekT9H/.net] Debugビルドしたら遅すぎて検証できなくて詰んだ
1006 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:34:17.71 ID:YQOjezK4.net] 典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、 テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな 原則的には、期待する出力は全てハードコードするのが正しい 難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ
1007 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 13:39:53.25 ID:iEIErwam.net] メカが絡むリアルタイム処理でそんな事出来るかよ
1008 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:13:38.33 ID:uFDqtnkl.net] >>982 Parameterized Testsがあれば十分じゃね?
1009 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:16:04.78 ID:uFDqtnkl.net] >>986 期待する出力をハードコードするから テストで「○○以上であること」って書くこと無いよね? こういうテストケースある?言い換えるとそういうマッチャーって必要?
1010 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 15:38:06.38 ID:AmwvkO78.net] 次スレは
1011 名前:デフォルトの名無しさん [2019/12/18(水) 16:59:26.54 ID:ksLRDXXy.net] よ。
1012 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 17:57:22.30 ID:uFDqtnkl.net] ほらよ C++相談室 part147 https://mevius.5ch.net/test/read.cgi/tech/1576659413/
1013 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 20:28:47.90 ID:CdPazUY7.net] >>987 それはまた別の話 ここで言ってるのは単体テストレベルの話だぞ
1014 名前:デフォルトの名無しさん [2019/12/18(水) 21:11:16.67 ID:LM1drZI+.net] クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?
1015 名前:蟻人間 mailto:sage [2019/12/18(水) 21:14:21.02 ID:Zo1XP656.net] >>995 strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.
1016 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 21:14:35.04 ID:uFDqtnkl.net] C言語でしっかり文字列処理出来るようになったほうがいい? → いい C++でC言語の文字列処理する? → しない
1017 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 21:16:04.08 ID:aoz4SWmd.net] >>987 逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。
1018 名前:デフォルトの名無しさん mailto:sage [2019/12/18(水) 23:15:57.41 ID:cF9WM4jz.net] >>992 乙 お前らコピー使うなムーブしろ
1019 名前:デフォルトの名無しさん mailto:sage [2019/12/19(木) 00:00:58.14 ID:zX6m0cqE.net] 単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝 Google TestとかTest::MoreとかJUnit使ったらワカル
1020 名前:蟻人間 mailto:sage [2019/12/19(木) 00:08:57.93 ID:r6T/W91o.net] あれっ?
1021 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 41日 12時間 33分 22秒
1022 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています