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/ (日本語)
700 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 06:56:32.11 ID:C/SdN+6e.net] >>615 >>683 「余再帰」 corecursion って呼ぶのか。勉強になるわ。 江添さんのページを見てみたんだけど、 「このコードは末尾再帰になっている。」の行の前に 最初の return n * factorial(n-1) を返す関数を 末尾再帰に書き換えたコードの引用があるべきなのを 挿入し忘れたように思えるね。 ・末尾再帰でないコード例を示す ・末尾再帰にするとこうなる ... コード欠落 ・末尾再帰はループに書き換えられるよ ・ループにしたコード例 っていう流れで自然に読めるでしょ。
701 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 09:42:39 ID:fV2E4bDP.net] でもこのシグネチャのfactorialのままだと末尾再帰できなくね?>>642みたいになるかと。
702 名前:デフォルトの名無しさん [2019/12/07(土) 11:49:45.97 ID:4p8EX4B8.net] >>685 たとえばbitsetを実装しようして、内部では32や64bitの整数へ保存するとして 参照だけではB[i]=1はできないかと
703 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 11:56:48.08 ID:vGCb4aWc.net] 最初からそうかけよ
704 名前:デフォルトの名無しさん [2019/12/07(土) 11:57:37.74 ID:4p8EX4B8.net] これのこと、毎回調べ直さないと作れない プロキシ 実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。 利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。 このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。 AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。 ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。 まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。 さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。 こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。 https://ufcpp.net/study/miscprog/accessor.html
705 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:00:39.08 ID:vGCb4aWc.net] 相談じゃないなら他へ
706 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:02:24.40 ID:U9XnFfRh.net] プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある 最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている 初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
707 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:11:07.35 ID:JfALL9r7.net] proxyで別に実行効率は下がらんよね てかstd::vector<bool>は大昔から存在するし
708 名前:デフォルトの名無しさん [2019/12/07(土) 12:25:43.42 ID:cPeMBqq7.net] C++Builder使えばよいのでは。
709 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:42:26.89 ID:JVuyt12v.net] >>684 , >>684 他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。 例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく 新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。 これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば... ・a[7] = 99; //setter ・cout << a[7]; //getter こうやって普通にアクセスできます。メソッドを分離したお陰で、 添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。 代入演算子は最低二種類必要で Inner& operator =(const T& value); // a[i] = value Inner& operator =(const Inner& rhs); // a[i] = a[j] 二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ ) 素人の思いつきですがサクっと試したら機能しました。 もっとスマートなやりかたもあるでしょう。
710 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 12:55:02.34 ID:vGCb4aWc.net] 意味の無い所で無駄にコードサイズを増やさなくても 普通にset/get関数で良いよ
711 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:20:15 ID:euj2mOhA.net] setterの戻り値はvoid?this参照?
712 名前:デフォルトの名無しさん [2019/12/07(土) 13:22:21 ID:cPeMBqq7.net] bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。
713 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:35:21 ID:QAzyzpfC.net] >>672 なんだてめえパープリンの活け造りが ぶち殺すぞ低脳野郎 ぶち殺し行ってやるから住所さらせや糞野郎
714 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:36:49 ID:hSwO/YRY.net] これがC++er流の挨拶です
715 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:37:29 ID:QAzyzpfC.net] >>672 真面目に糞情報しか提供できない出来損ないならすっこんでろウスノロ とにかくぶち殺しに行ってやるから住所晒せや
716 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:38:45 ID:QAzyzpfC.net] >>678 今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
717 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 13:44:27 ID:QAzyzpfC.net] パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT パープリンどころかアホの活造り ID:zfbHpqVT 出てこい知障
718 名前:デフォルトの名無しさん [2019/12/07(土) 13:49:37 ID:cPeMBqq7.net] そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。 整数ではないものを整数で代用したときに起きる問題なのかも。
719 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 14:40:05 ID:gqZSFnI2.net] 効いてる効いてるw 弱い犬ほどよく吠えるねえ
720 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 15:57:37 ID:kC4yD5gf.net] >>683 江添なんて前からそんなもんだぞ。 人の間違いには厳しいが自分の間違いには逆ギレするような男だ。
721 名前:デフォルトの名無しさん [2019/12/07(土) 15:59:46 ID:cPeMBqq7.net] clang-cl結構いいね。
722 名前:デフォルトの名無しさん [2019/12/07(土) 16:00:40 ID:cPeMBqq7.net] >>707 全方面に厳しいって事? 自分にも他人にも。
723 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 16:33:39.12 ID:C/SdN+6e.net] 「自分の間違い(に対する指摘)には逆ギレ」ってことでしょな。 書籍として印刷・発売する前にネット公開して広く意見を求める、 「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば 誰にも損のないやり方だと思うけどね。 少なくとも俺にとってはありがたい。
724 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 17:24:58.21 ID:ZsYnLuoj.net] 意見を反映させる能力があればな。
725 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 17:31:56.94 ID:xzwyWWlr.net] https://github.com/EzoeRyou/cpp-intro/issues
726 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 20:57:58.81 ID:KRZcErEE.net] なんかうちのVisual Studioだと iscntrl('\t') が非0(真)になるんだけど これって正しい?
727 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 21:22:47.02 ID:F8+HNqgO.net] 表示できる文字と空白以外は全部制御文字だね
728 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 22:13:42.05 ID:KRZcErEE.net] isspace('\t')は非0(真)なので'\t'は空白のはずェ、 つかGoogle Testにかけたらこうじゃわ↓↓↓ TEST(stdlibTest, ctype) { ASSERT_FALSE(isspace('\0')); ASSERT_TRUE(isspace('\n')); ASSERT_TRUE(isspace('\r')); ASSERT_TRUE(isspace('\t')); ASSERT_TRUE(isspace(' ')); ASSERT_TRUE(iscntrl('\0')); ASSERT_TRUE(iscntrl('\n')); ASSERT_TRUE(iscntrl('\r')); ASSERT_TRUE(iscntrl('\t')); ASSERT_FALSE(iscntrl(' ')); }
729 名前:デフォルトの名無しさん [2019/12/07(土) 23:02:18.90 ID:cPeMBqq7.net] 盲目の為のロケールがあったら、ベル以外全部制御文字になるんだろか。
730 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 23:12:25.74 ID:fV2E4bDP.net] 0x00から0x1fまでは全部制御文字で違和感ないけど。
731 名前:デフォルトの名無しさん mailto:sage [2019/12/07(土) 23:19:02.06 ID:EVNez7Da.net] printableってのは音声出力も含むのではなかろうか
732 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 02:49:31 ID:C6vow3qq.net] 盲人のブログラマーって普通にいるんだな なんかかっけーな
733 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 08:37:40.25 ID:9eRqVWoa.net] Visual Studio 16.4オンラインアプデしたら それまで使ってたParallel Studio2019 U5使えなくなった。 Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう それと、 プロジェクトのプロパティからIntel Compilerは選択できるんだが、 プルダウンメニューからIntel Compilerを選択できないようになった。 Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?
734 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 08:39:40.14 ID:drue7Jpy.net] >>713 例によってロケール依存らしいが "C" だと iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。 これまた例によって unsigned char 範囲と EOF 以外の値については未定義。 つうか、このくらいは5ちゃんねる以外から情報を探す方が 早くて確実じゃないかしら。
735 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 13:11:02.08 ID:hM3Qn2JU.net] C++で作ったブラウザテニスゲーム(PWA仮対応): https://yutakaaoki.github.io/demo_tennis/ Wasm+PWA+WebGL+"C++"
736 名前:デフォルトの名無しさん [2019/12/08(日) 14:09:36.54 ID:3pi+cAN/.net] >>722 青木さんは何をしようとしてるんですか?
737 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 14:17:37.03 ID:vN1dzuVf.net] >>722 で、質問は?
738 名前:デフォルトの名無しさん [2019/12/08(日) 14:36:36.30 ID:3pi+cAN/.net] もっと早くは最速って意味ですか? それとも速くしたいって意味ですか?
739 名前:デフォルトの名無しさん [2019/12/08(日) 14:56:59.55 ID:3pi+cAN/.net] インテリコード、ほんとに提案してくるね。 お前は次にこう書く・・・って。
740 名前:デフォルトの名無しさん [2019/12/08(日) 15:02:14.03 ID:J+6Nu+8f.net] 歯垢の妨げにしかならんわ
741 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:09:58.86 ID:hM3Qn2JU.net] >>723 C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは 貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは 凌ごうかと思いました。 ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も 無料で使えることにして、みなさんのお力をお借りして native対応の ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android くらいまでなら対応できる目処は立ってます。iOSについては、swift 言語が出したオブジェクトファイルとリンクすることはWindows上でも 実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を 用意することはできそうです。 Mac miniがあれば、iOS native 対応も出来そうなんですが。
742 名前:デフォルトの名無しさん [2019/12/08(日) 17:29:31.80 ID:3pi+cAN/.net] 基本的にネイティブ志向なんですね。
743 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:29:36.52 ID:oOCB7Yl8.net] >>728 ソースコード見せて
744 名前:デフォルトの名無しさん [2019/12/08(日) 17:30:50.90 ID:3pi+cAN/.net] ウェブアセンブラは興味あるんだけど、イマイチ情報が。
745 名前:デフォルトの名無しさん [2019/12/08(日) 17:32:13.08 ID:3pi+cAN/.net] 高橋茉奈著やさしいウェブアセンブラが待たれる今日この頃。
746 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:37:23.93 ID:hM3Qn2JU.net] >>730 ライセンスは、BSD, MIT, LGPL(静的リンクしてもGPL感染しない例外あり) の どれかにするか迷っています。
747 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 17:43:51.77 ID:8Jdq2NjK.net] WTFPLライセンスにしようぜ
748 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 23:33:02 ID:Cj3eSjEv.net] >>721 >"C" だと >iscntrl() が真を返す値は 0x00-0x1f, 0x7f ほう、そんなことが規格のどこにかいてあるのですか
749 名前:デフォルトの名無しさん mailto:sage [2019/12/08(日) 23:58:38 .net] >>722 Android 4.4.2 Chromeで動作した
750 名前:デフォルトの名無しさん [2019/12/09(月) 01:41:27 ID:ExBOPGUm.net] ID無いのは5chの人って事?
751 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 01:45:35 ID:aHmkn8DW.net] 有料ユーザーってこと
752 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 01:45:54 ID:dDDj5i4x.net] これ5chじゃなかったの?
753 名前:デフォルトの名無しさん [2019/12/09(月) 02:33:36.15 ID:ExBOPGUm.net] そうなんだ。
754 名前:デフォルトの名無しさん [2019/12/09(月) 02:41:32 ID:ExBOPGUm.net] >>739 なかの人はID付かないのかなって。
755 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 08:06:32.09 ID:V5HcCSm8.net] >>735 C++ の規格が引用してる C の規格じゃないかな。 質問のつもりで書いてるなら、あまりに態度が悪い気がするし、 「その投稿の内容は間違ってる」と主張したいなら、 もっと直接的・具体的に間違ってるという根拠を示すべきだと思うよ。
756 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 09:58:16 ID:CUCDgsHX.net] >>736 ありがとう。
757 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 17:54:07.48 ID:c5eP1gUS.net] >>742 デタラメぬかしておいて根拠を求められたら示せないばかりか オマエこそデタラメである根拠を出せとか、さすがですね
758 名前:720 mailto:sage [2019/12/09(月) 18:35:46.39 ID:ZGVF76Fo.net] 自己レスです Visual Studio 16.4では Intel Parallel Studio 2019 u5は動かないようです。 16.3に戻せないし どーしよー https://software.intel.com/en-us/forums/intel-c-compiler/topic/840467
759 名前:デフォルトの名無しさん [2019/12/09(月) 19:45:24.14 ID:ExBOPGUm.net] POSIXには明確にCロケールの定義が書かれていた。
760 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 20:19:32.09 ID:B3OID8x5.net] >>745 今のVSの最新版は人柱仕様であり、検証無しでプロダクション用をアップデートしてはいけません 勉強になったねー
761 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:02:54.27 ID:HdhKIpY6.net] 昔からVSはそんなもんだ。 てかc++コンパイラなんて全部そんなもんだ。
762 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:45:50.54 ID:P+A0aO3e.net] >>745 リンク先に回避策があるって書いてあるやん
763 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 21:53:17.84 ID:G+eF5KMH.net] >>746 それはCの規格と必ずしもイコールではないがな。
764 名前:デフォルトの名無しさん [2019/12/09(月) 22:32:03.14 ID:ExBOPGUm.net] どういうことですか。
765 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:24:28.11 ID:qFr59Y2H.net] POSIX には ISO C には無い追加の定めがあり、したがって
766 名前:> POSIX にある定めは必ずしも ISO C 一般に言えることではないということです。 [] [ここ壊れてます]
767 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:30:20.36 ID:c5Uv/Cv5.net] わかったはもうこれからはstd::isspace()とstd::iscntrl()を使うは
768 名前:デフォルトの名無しさん [2019/12/09(月) 23:43:16.79 ID:ExBOPGUm.net] メンバ変数にstd::listを使うと移動コンストラクタがnoexceptに出来ないのですが。 こんな時はどうするのでしょう。
769 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:58:06.53 ID:aHmkn8DW.net] メンバのstd::listをポインタにする
770 名前:デフォルトの名無しさん mailto:sage [2019/12/09(月) 23:59:06.89 ID:qFr59Y2H.net] >>754 まず何を見て「出来ない」と言っているのかを明らかにします。
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 その場合でも排他制御は基本的には必要。 たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。 別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。