C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
C++相談室 part146
■ このスレッドは過去ログ倉庫に格納されています
2019/11/07(木) 11:35:36.76ID:4wggfTwe
683デフォルトの名無しさん
2019/12/07(土) 01:08:17.23684デフォルトの名無しさん
2019/12/07(土) 01:59:52.93ID:4p8EX4B8685デフォルトの名無しさん
2019/12/07(土) 05:36:21.30ID:UnIspDfI686デフォルトの名無しさん
2019/12/07(土) 06:10:47.12 ちょくちょく初心者質問スレに行った方が良い人までここに堂々と書き込むのが
スレを妙な雰囲気にしてる
スレを妙な雰囲気にしてる
687デフォルトの名無しさん
2019/12/07(土) 06:56:32.11ID:C/SdN+6e688デフォルトの名無しさん
2019/12/07(土) 09:42:39.92ID:fV2E4bDP でもこのシグネチャのfactorialのままだと末尾再帰できなくね?>>642みたいになるかと。
689デフォルトの名無しさん
2019/12/07(土) 11:49:45.97ID:4p8EX4B8690デフォルトの名無しさん
2019/12/07(土) 11:56:48.08ID:vGCb4aWc 最初からそうかけよ
691デフォルトの名無しさん
2019/12/07(土) 11:57:37.74ID:4p8EX4B8 これのこと、毎回調べ直さないと作れない
プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。
利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。
このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。
ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。
まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。
こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html
プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。
利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。
このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。
ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。
まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。
こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html
692デフォルトの名無しさん
2019/12/07(土) 12:00:39.08ID:vGCb4aWc 相談じゃないなら他へ
693デフォルトの名無しさん
2019/12/07(土) 12:02:24.40ID:U9XnFfRh プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
694デフォルトの名無しさん
2019/12/07(土) 12:11:07.35ID:JfALL9r7 proxyで別に実行効率は下がらんよね
てかstd::vector<bool>は大昔から存在するし
てかstd::vector<bool>は大昔から存在するし
695デフォルトの名無しさん
2019/12/07(土) 12:25:43.42ID:cPeMBqq7 C++Builder使えばよいのでは。
696デフォルトの名無しさん
2019/12/07(土) 12:42:26.89ID:JVuyt12v >>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がコピーされるだけ )
素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
他言語での 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がコピーされるだけ )
素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
697デフォルトの名無しさん
2019/12/07(土) 12:55:02.34ID:vGCb4aWc 意味の無い所で無駄にコードサイズを増やさなくても
普通にset/get関数で良いよ
普通にset/get関数で良いよ
698デフォルトの名無しさん
2019/12/07(土) 13:20:15.07ID:euj2mOhA setterの戻り値はvoid?this参照?
699デフォルトの名無しさん
2019/12/07(土) 13:22:21.40ID:cPeMBqq7 bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。
700デフォルトの名無しさん
2019/12/07(土) 13:35:21.54ID:QAzyzpfC701デフォルトの名無しさん
2019/12/07(土) 13:36:49.02ID:hSwO/YRY これがC++er流の挨拶です
702デフォルトの名無しさん
2019/12/07(土) 13:37:29.36ID:QAzyzpfC703デフォルトの名無しさん
2019/12/07(土) 13:38:45.35ID:QAzyzpfC >>678
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
704デフォルトの名無しさん
2019/12/07(土) 13:44:27.19ID:QAzyzpfC パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
出てこい知障
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
パープリンどころかアホの活造り ID:zfbHpqVT
出てこい知障
705デフォルトの名無しさん
2019/12/07(土) 13:49:37.66ID:cPeMBqq7 そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。
整数ではないものを整数で代用したときに起きる問題なのかも。
整数ではないものを整数で代用したときに起きる問題なのかも。
706デフォルトの名無しさん
2019/12/07(土) 14:40:05.37ID:gqZSFnI2 効いてる効いてるw
弱い犬ほどよく吠えるねえ
弱い犬ほどよく吠えるねえ
707デフォルトの名無しさん
2019/12/07(土) 15:57:37.60ID:kC4yD5gf708デフォルトの名無しさん
2019/12/07(土) 15:59:46.23ID:cPeMBqq7 clang-cl結構いいね。
709デフォルトの名無しさん
2019/12/07(土) 16:00:40.56ID:cPeMBqq7710デフォルトの名無しさん
2019/12/07(土) 16:33:39.12ID:C/SdN+6e 「自分の間違い(に対する指摘)には逆ギレ」ってことでしょな。
書籍として印刷・発売する前にネット公開して広く意見を求める、
「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば
誰にも損のないやり方だと思うけどね。
少なくとも俺にとってはありがたい。
書籍として印刷・発売する前にネット公開して広く意見を求める、
「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば
誰にも損のないやり方だと思うけどね。
少なくとも俺にとってはありがたい。
711デフォルトの名無しさん
2019/12/07(土) 17:24:58.21ID:ZsYnLuoj 意見を反映させる能力があればな。
712デフォルトの名無しさん
2019/12/07(土) 17:31:56.94ID:xzwyWWlr713デフォルトの名無しさん
2019/12/07(土) 20:57:58.81ID:KRZcErEE なんかうちのVisual Studioだと
iscntrl('\t')
が非0(真)になるんだけど
これって正しい?
iscntrl('\t')
が非0(真)になるんだけど
これって正しい?
714デフォルトの名無しさん
2019/12/07(土) 21:22:47.02ID:F8+HNqgO 表示できる文字と空白以外は全部制御文字だね
715デフォルトの名無しさん
2019/12/07(土) 22:13:42.05ID:KRZcErEE 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(' '));
}
つか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(' '));
}
716デフォルトの名無しさん
2019/12/07(土) 23:02:18.90ID:cPeMBqq7 盲目の為のロケールがあったら、ベル以外全部制御文字になるんだろか。
717デフォルトの名無しさん
2019/12/07(土) 23:12:25.74ID:fV2E4bDP 0x00から0x1fまでは全部制御文字で違和感ないけど。
718デフォルトの名無しさん
2019/12/07(土) 23:19:02.06ID:EVNez7Da printableってのは音声出力も含むのではなかろうか
719デフォルトの名無しさん
2019/12/08(日) 02:49:31.16ID:C6vow3qq 盲人のブログラマーって普通にいるんだな
なんかかっけーな
なんかかっけーな
720デフォルトの名無しさん
2019/12/08(日) 08:37:40.25ID:9eRqVWoa Visual Studio 16.4オンラインアプデしたら
それまで使ってたParallel Studio2019 U5使えなくなった。
Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう
それと、
プロジェクトのプロパティからIntel Compilerは選択できるんだが、
プルダウンメニューからIntel Compilerを選択できないようになった。
Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?
それまで使ってたParallel Studio2019 U5使えなくなった。
Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう
それと、
プロジェクトのプロパティからIntel Compilerは選択できるんだが、
プルダウンメニューからIntel Compilerを選択できないようになった。
Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?
721デフォルトの名無しさん
2019/12/08(日) 08:39:40.14ID:drue7Jpy >>713
例によってロケール依存らしいが "C" だと
iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。
これまた例によって unsigned char 範囲と EOF 以外の値については未定義。
つうか、このくらいは5ちゃんねる以外から情報を探す方が
早くて確実じゃないかしら。
例によってロケール依存らしいが "C" だと
iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。
これまた例によって unsigned char 範囲と EOF 以外の値については未定義。
つうか、このくらいは5ちゃんねる以外から情報を探す方が
早くて確実じゃないかしら。
722デフォルトの名無しさん
2019/12/08(日) 13:11:02.08ID:hM3Qn2JU723デフォルトの名無しさん
2019/12/08(日) 14:09:36.54ID:3pi+cAN/ >>722
青木さんは何をしようとしてるんですか?
青木さんは何をしようとしてるんですか?
724デフォルトの名無しさん
2019/12/08(日) 14:17:37.03ID:vN1dzuVf >>722
で、質問は?
で、質問は?
725デフォルトの名無しさん
2019/12/08(日) 14:36:36.30ID:3pi+cAN/ もっと早くは最速って意味ですか?
それとも速くしたいって意味ですか?
それとも速くしたいって意味ですか?
726デフォルトの名無しさん
2019/12/08(日) 14:56:59.55ID:3pi+cAN/ インテリコード、ほんとに提案してくるね。
お前は次にこう書く・・・って。
お前は次にこう書く・・・って。
727デフォルトの名無しさん
2019/12/08(日) 15:02:14.03ID:J+6Nu+8f 歯垢の妨げにしかならんわ
728デフォルトの名無しさん
2019/12/08(日) 17:09:58.86ID:hM3Qn2JU >>723
C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの
ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは
貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは
凌ごうかと思いました。
ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も
無料で使えることにして、みなさんのお力をお借りして native対応の
ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android
くらいまでなら対応できる目処は立ってます。iOSについては、swift
言語が出したオブジェクトファイルとリンクすることはWindows上でも
実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を
用意することはできそうです。
Mac miniがあれば、iOS native 対応も出来そうなんですが。
C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの
ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは
貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは
凌ごうかと思いました。
ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も
無料で使えることにして、みなさんのお力をお借りして native対応の
ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android
くらいまでなら対応できる目処は立ってます。iOSについては、swift
言語が出したオブジェクトファイルとリンクすることはWindows上でも
実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を
用意することはできそうです。
Mac miniがあれば、iOS native 対応も出来そうなんですが。
729デフォルトの名無しさん
2019/12/08(日) 17:29:31.80ID:3pi+cAN/ 基本的にネイティブ志向なんですね。
730デフォルトの名無しさん
2019/12/08(日) 17:29:36.52ID:oOCB7Yl8 >>728
ソースコード見せて
ソースコード見せて
731デフォルトの名無しさん
2019/12/08(日) 17:30:50.90ID:3pi+cAN/ ウェブアセンブラは興味あるんだけど、イマイチ情報が。
732デフォルトの名無しさん
2019/12/08(日) 17:32:13.08ID:3pi+cAN/ 高橋茉奈著やさしいウェブアセンブラが待たれる今日この頃。
733デフォルトの名無しさん
2019/12/08(日) 17:37:23.93ID:hM3Qn2JU734デフォルトの名無しさん
2019/12/08(日) 17:43:51.77ID:8Jdq2NjK WTFPLライセンスにしようぜ
735デフォルトの名無しさん
2019/12/08(日) 23:33:02.58ID:Cj3eSjEv736デフォルトの名無しさん
2019/12/08(日) 23:58:38.94 >>722
Android 4.4.2 Chromeで動作した
Android 4.4.2 Chromeで動作した
737デフォルトの名無しさん
2019/12/09(月) 01:41:27.18ID:ExBOPGUm ID無いのは5chの人って事?
738デフォルトの名無しさん
2019/12/09(月) 01:45:35.78ID:aHmkn8DW 有料ユーザーってこと
739デフォルトの名無しさん
2019/12/09(月) 01:45:54.45ID:dDDj5i4x これ5chじゃなかったの?
740デフォルトの名無しさん
2019/12/09(月) 02:33:36.15ID:ExBOPGUm そうなんだ。
741デフォルトの名無しさん
2019/12/09(月) 02:41:32.17ID:ExBOPGUm >>739
なかの人はID付かないのかなって。
なかの人はID付かないのかなって。
742デフォルトの名無しさん
2019/12/09(月) 08:06:32.09ID:V5HcCSm8 >>735
C++ の規格が引用してる C の規格じゃないかな。
質問のつもりで書いてるなら、あまりに態度が悪い気がするし、
「その投稿の内容は間違ってる」と主張したいなら、
もっと直接的・具体的に間違ってるという根拠を示すべきだと思うよ。
C++ の規格が引用してる C の規格じゃないかな。
質問のつもりで書いてるなら、あまりに態度が悪い気がするし、
「その投稿の内容は間違ってる」と主張したいなら、
もっと直接的・具体的に間違ってるという根拠を示すべきだと思うよ。
743デフォルトの名無しさん
2019/12/09(月) 09:58:16.97ID:CUCDgsHX >>736
ありがとう。
ありがとう。
744デフォルトの名無しさん
2019/12/09(月) 17:54:07.48ID:c5eP1gUS745720
2019/12/09(月) 18:35:46.39ID:ZGVF76Fo 自己レスです
Visual Studio 16.4では
Intel Parallel Studio 2019 u5は動かないようです。
16.3に戻せないし
どーしよー
https://software.intel.com/en-us/forums/intel-c-compiler/topic/840467
Visual Studio 16.4では
Intel Parallel Studio 2019 u5は動かないようです。
16.3に戻せないし
どーしよー
https://software.intel.com/en-us/forums/intel-c-compiler/topic/840467
746デフォルトの名無しさん
2019/12/09(月) 19:45:24.14ID:ExBOPGUm POSIXには明確にCロケールの定義が書かれていた。
747デフォルトの名無しさん
2019/12/09(月) 20:19:32.09ID:B3OID8x5748デフォルトの名無しさん
2019/12/09(月) 21:02:54.27ID:HdhKIpY6 昔からVSはそんなもんだ。
てかc++コンパイラなんて全部そんなもんだ。
てかc++コンパイラなんて全部そんなもんだ。
749デフォルトの名無しさん
2019/12/09(月) 21:45:50.54ID:P+A0aO3e >>745
リンク先に回避策があるって書いてあるやん
リンク先に回避策があるって書いてあるやん
750デフォルトの名無しさん
2019/12/09(月) 21:53:17.84ID:G+eF5KMH >>746
それはCの規格と必ずしもイコールではないがな。
それはCの規格と必ずしもイコールではないがな。
751デフォルトの名無しさん
2019/12/09(月) 22:32:03.14ID:ExBOPGUm どういうことですか。
752デフォルトの名無しさん
2019/12/09(月) 23:24:28.11ID:qFr59Y2H POSIX には ISO C には無い追加の定めがあり、したがって
POSIX にある定めは必ずしも ISO C 一般に言えることではないということです。
POSIX にある定めは必ずしも ISO C 一般に言えることではないということです。
753デフォルトの名無しさん
2019/12/09(月) 23:30:20.36ID:c5Uv/Cv5 わかったはもうこれからはstd::isspace()とstd::iscntrl()を使うは
754デフォルトの名無しさん
2019/12/09(月) 23:43:16.79ID:ExBOPGUm メンバ変数にstd::listを使うと移動コンストラクタがnoexceptに出来ないのですが。
こんな時はどうするのでしょう。
こんな時はどうするのでしょう。
755デフォルトの名無しさん
2019/12/09(月) 23:58:06.53ID:aHmkn8DW メンバのstd::listをポインタにする
756デフォルトの名無しさん
2019/12/09(月) 23:59:06.89ID:qFr59Y2H >>754
まず何を見て「出来ない」と言っているのかを明らかにします。
まず何を見て「出来ない」と言っているのかを明らかにします。
757デフォルトの名無しさん
2019/12/10(火) 00:04:16.84ID:KeuWZv5z758デフォルトの名無しさん
2019/12/10(火) 00:06:34.29ID:KeuWZv5z std::swapの特殊化がnoexceptです。
これを使いますか。
これを使いますか。
759デフォルトの名無しさん
2019/12/10(火) 00:08:47.32ID:KeuWZv5z 引数無しのコンストラクタがnoexceptじゃないから無理でした。
760デフォルトの名無しさん
2019/12/10(火) 00:37:17.09ID:OASxW0Hh そもそも noexcept にする必要性が不明だし、呼び出してる関数が
全部 noexcept じゃなくても std::list 実装を限定してよかったり、特定実装での
bad_alloc =即死の不都合が必要性と釣り合うなら noexcept にすることはできるし、
最大限の移植性も bad_alloc の通知も noexcept もすべて本当に必要なら
>755 でポインタって答えも出てるのに。
全部 noexcept じゃなくても std::list 実装を限定してよかったり、特定実装での
bad_alloc =即死の不都合が必要性と釣り合うなら noexcept にすることはできるし、
最大限の移植性も bad_alloc の通知も noexcept もすべて本当に必要なら
>755 でポインタって答えも出てるのに。
761デフォルトの名無しさん
2019/12/10(火) 00:41:00.11ID:2YzAsKi1 自動でnoexceptに成らないなら、自分で望みのnoexceptの定義すりゃ良いだろうに
部品が例外投げるなら内部でcatchして適切に処理すればいい
部品が例外投げるなら内部でcatchして適切に処理すればいい
762デフォルトの名無しさん
2019/12/10(火) 00:43:28.28ID:KeuWZv5z763デフォルトの名無しさん
2019/12/10(火) 07:32:12.43ID:Xhvd8FYl >>761
正論
正論
764デフォルトの名無しさん
2019/12/10(火) 19:05:35.05ID:yM6al2d7 途中でcコード通るとか何らかの理由があるんだろう。
765デフォルトの名無しさん
2019/12/11(水) 13:14:22.35ID:KfdgnhFC ある一つの変数に対してstd::threadで作成したプロセスは値を更新し続けて、メイン関数の方では値を読み続ける場合は排他処理する必要はありませんか?
メイン関数の方は必要なときだけ値が読めればいいので読みこぼしは無視していいです
メイン関数の方は必要なときだけ値が読めればいいので読みこぼしは無視していいです
766デフォルトの名無しさん
2019/12/11(水) 13:19:53.65ID:iOg65oSz >>765
変数が std::atomic<T> でなければ排他制御の必要があります。
変数が std::atomic<T> でなければ排他制御の必要があります。
767デフォルトの名無しさん
2019/12/11(水) 13:21:20.19ID:m9WEF2SZ768デフォルトの名無しさん
2019/12/11(水) 13:23:21.98ID:/1t9T7AP 基本型かつ確実にレジスタでなくメモリに書き出されているならそうだね
std::atomcを使うのが無難
その条件ならmemory_order_relaxedを指定すればバリアのオーバーヘッドは避けられる
面倒だけどね
std::atomcを使うのが無難
その条件ならmemory_order_relaxedを指定すればバリアのオーバーヘッドは避けられる
面倒だけどね
769デフォルトの名無しさん
2019/12/11(水) 13:35:45.33ID:IATqHbi6 質問者じゃないけど
読みこぼしとかタイミングによるズレが問題ないとしても排他制御なしに読み書きする時点で未定義動作だからNG
って認識でおk?
読みこぼしとかタイミングによるズレが問題ないとしても排他制御なしに読み書きする時点で未定義動作だからNG
って認識でおk?
770デフォルトの名無しさん
2019/12/11(水) 13:46:34.56ID:iOg65oSz はい。
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.
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.
771デフォルトの名無しさん
2019/12/11(水) 14:00:16.36ID:/1t9T7AP 言語仕様はそうだろうけど
x86なら実際は多くの場合バリア不要だったりするから
最終的にどういうinstructionになっているのか知っておくと理解が深まる
x86なら実際は多くの場合バリア不要だったりするから
最終的にどういうinstructionになっているのか知っておくと理解が深まる
772デフォルトの名無しさん
2019/12/11(水) 15:24:29.91ID:nkoUZIKM x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
これ以外だったり同期が必要なければ
排他制御は不要
もちろん、
一連のデータリードでデータの一貫性が必要であれば一貫性確認の仕組みなり排他制御なりは当然必要だし、
コンパイラが読み書きを省略する可能性のあるコードであれば
volatileを付けるなど、省略を防ぐ必要はある
ymmレジスタを使えばアトミックな読み書きが出来るので
256bit以内なら一貫性も保てる
マルチコアARMの場合は
DMB命令を入れておけば確実
パフォーマンスに問題が無い箇所であれば、
移植性の為にも、素直にC++の排他制御を入れておこう!
これ以外だったり同期が必要なければ
排他制御は不要
もちろん、
一連のデータリードでデータの一貫性が必要であれば一貫性確認の仕組みなり排他制御なりは当然必要だし、
コンパイラが読み書きを省略する可能性のあるコードであれば
volatileを付けるなど、省略を防ぐ必要はある
ymmレジスタを使えばアトミックな読み書きが出来るので
256bit以内なら一貫性も保てる
マルチコアARMの場合は
DMB命令を入れておけば確実
パフォーマンスに問題が無い箇所であれば、
移植性の為にも、素直にC++の排他制御を入れておこう!
773デフォルトの名無しさん
2019/12/11(水) 15:42:23.89ID:ax9A/ZTc お前らRustに移行とか考えたりするの?
774デフォルトの名無しさん
2019/12/11(水) 17:37:57.91ID:bM/oaPHs >>773
個人的には絶対に移行したくないと思っている。
個人的には絶対に移行したくないと思っている。
775デフォルトの名無しさん
2019/12/11(水) 17:42:08.10ID:/1t9T7AP どっちもやったらええがな
776デフォルトの名無しさん
2019/12/11(水) 18:13:18.74ID:bM/oaPHs >>771
質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、
物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。
一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が
あるため。
もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、
僅かにタイミングがずれることで、「すれ違い」現象の様なことが
おきることがある。これが起きると、変数の値をフラグ的に利用して
厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。
これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
していたらしい。
2つのスレッドでデータをやり取りする場合には色々と注意が必要で、
普通はデータが準備できたかどうかをCreateEvent(),SetEvent(),
WaitForSingleEvent()などで待機して処理するのが基本。
質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、
物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。
一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が
あるため。
もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、
僅かにタイミングがずれることで、「すれ違い」現象の様なことが
おきることがある。これが起きると、変数の値をフラグ的に利用して
厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。
これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
していたらしい。
2つのスレッドでデータをやり取りする場合には色々と注意が必要で、
普通はデータが準備できたかどうかをCreateEvent(),SetEvent(),
WaitForSingleEvent()などで待機して処理するのが基本。
777デフォルトの名無しさん
2019/12/11(水) 18:17:08.59ID:bM/oaPHs >>776
スマン。XOR交換命令ではなく、xchg命令だった。
スマン。XOR交換命令ではなく、xchg命令だった。
778デフォルトの名無しさん
2019/12/11(水) 18:20:46.73ID:NtLrnXCf goよりかはrustの方が全然マシやと思うぞ
最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ〜
最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ〜
779デフォルトの名無しさん
2019/12/11(水) 18:30:30.06ID:/1t9T7AP >>776
xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解
xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解
780デフォルトの名無しさん
2019/12/11(水) 18:36:33.88ID:bM/oaPHs781デフォルトの名無しさん
2019/12/11(水) 18:38:56.23ID:bM/oaPHs MFENCE
PREFETCH
MOVNTDQA
LFENCE(?)
XCHG
LOCK prefix
WC Memory
↑沢山あるけど、よく分からない。
xchgもちゃんと理解できてない。
PREFETCH
MOVNTDQA
LFENCE(?)
XCHG
LOCK prefix
WC Memory
↑沢山あるけど、よく分からない。
xchgもちゃんと理解できてない。
782デフォルトの名無しさん
2019/12/11(水) 18:39:59.12ID:bM/oaPHs MFENCE, LFENCE, SFENCE。
服のサイズみたいだ。分からん。
服のサイズみたいだ。分からん。
783デフォルトの名無しさん
2019/12/11(水) 18:46:12.74ID:bM/oaPHs >>779
xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。
xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 千葉県民だけどなんか地震あったらしいな
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 高市総理、睡眠時間30分😢
- 秋田大学のホームページがつながらなくなって1日以上経つのだが
- 【速報】高市早苗、起床 [779938112]
- 共産党議員「日本は中国を侵略した歴史がある」→ネトウヨ「そんな歴史は無い!捏造するな!!国家侮辱罪で逮捕だ!!!」 [314039747]
