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
785デフォルトの名無しさん
2019/12/12(木) 00:31:42.87ID:n5d2iAqE >>765
その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
786デフォルトの名無しさん
2019/12/12(木) 00:36:46.28ID:n5d2iAqE787デフォルトの名無しさん
2019/12/12(木) 00:54:16.98ID:UvCIGzud AVXを使えば256bitを1命令で
AVX512を使えば512bitを1命令で
読み書き可能
AVX512を使えば512bitを1命令で
読み書き可能
788デフォルトの名無しさん
2019/12/12(木) 01:00:12.24ID:UvCIGzud x86系だとCMPXCHG命令
ARMだとLL, AC命令
がデータの一貫性確認に使える
ARMだとLL, AC命令
がデータの一貫性確認に使える
789デフォルトの名無しさん
2019/12/12(木) 03:03:25.42ID:hmkgwwLY とんちプログラミングはもう流行らなさそう。
790デフォルトの名無しさん
2019/12/12(木) 03:28:17.88ID:J/GuvI9A とんちプログラミングwww
791デフォルトの名無しさん
2019/12/12(木) 03:55:57.93ID:g+q4RhTJ > これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
> していたらしい。
当たり前じゃね?アトミックな命令を使うのは基本だと思うが
> していたらしい。
当たり前じゃね?アトミックな命令を使うのは基本だと思うが
792デフォルトの名無しさん
2019/12/12(木) 07:30:46.73ID:UvCIGzud XOR
793デフォルトの名無しさん
2019/12/12(木) 07:43:20.40ID:Vt8W+oPZ xor rax,rbx
xor rbx,rax
xor rax,rbx
これでswap rax,rbx相当ってことね
xor rbx,rax
xor rax,rbx
これでswap rax,rbx相当ってことね
794デフォルトの名無しさん
2019/12/12(木) 07:53:00.21ID:UvCIGzud795デフォルトの名無しさん
2019/12/12(木) 10:43:59.85ID:r0VN1UlG condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?
796デフォルトの名無しさん
2019/12/12(木) 10:56:19.34ID:WJA8YZFG 時空が逆流し、針の先から悪魔が生まれる
797デフォルトの名無しさん
2019/12/12(木) 11:06:56.29ID:a67Hqgb2 jsに対するTypeScriptみたいな感じで
C++に対するRustっていう認識は間違ってるが
それならC++に対するそれは何が適当なんかある?
C++に対するRustっていう認識は間違ってるが
それならC++に対するそれは何が適当なんかある?
798デフォルトの名無しさん
2019/12/12(木) 11:10:12.33ID:Vt8W+oPZ allに該当する要素の数が0なのを特別視する必要はなさそう
799デフォルトの名無しさん
2019/12/12(木) 11:21:14.68ID:NrsugUJv 非同期な操作やしその瞬間何も起きんなら単にスルーするだけ
800デフォルトの名無しさん
2019/12/12(木) 12:01:38.93ID:Z8SHCwDj >>797
無い。
無い。
801デフォルトの名無しさん
2019/12/12(木) 12:26:43.11ID:gL/Y8Ccu >>797
Managed C++とかC++/CLIとか
Managed C++とかC++/CLIとか
802デフォルトの名無しさん
2019/12/12(木) 13:04:34.98ID:Z8SHCwDj >>801
それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
803デフォルトの名無しさん
2019/12/12(木) 13:08:42.86ID:b3wcvAqB C++は型安全だからC++はC++
804デフォルトの名無しさん
2019/12/12(木) 14:17:55.83ID:CNmkwPhj 型安全認定された!
805デフォルトの名無しさん
2019/12/12(木) 14:59:18.45ID:ZWrMIDdu ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら
C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた
ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな
そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた
ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな
そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
806デフォルトの名無しさん
2019/12/12(木) 16:27:22.69ID:AVYkL4QT JSが危険ってどういう事?
C/C++は型がない=危険だけど
JSなんかは型安全な言語だからちゃんと例外になって、
メモリ保護エラーとか起こすこと無いけど?
C/C++は型がない=危険だけど
JSなんかは型安全な言語だからちゃんと例外になって、
メモリ保護エラーとか起こすこと無いけど?
807デフォルトの名無しさん
2019/12/12(木) 16:39:21.91ID:hmkgwwLY Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?
808デフォルトの名無しさん
2019/12/12(木) 16:47:21.68ID:hmkgwwLY C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?
809デフォルトの名無しさん
2019/12/12(木) 18:38:14.77ID:Ijd1d2r8 毎回フルスキャンしたいならどうぞ
810デフォルトの名無しさん
2019/12/12(木) 18:59:14.59ID:hmkgwwLY ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。
811デフォルトの名無しさん
2019/12/12(木) 19:07:50.30ID:Z8SHCwDj >>806
型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。
また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。
また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。
どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。
また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。
また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。
どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
812デフォルトの名無しさん
2019/12/12(木) 19:25:03.70ID:AVYkL4QT >>811
お前が型安全の意味を間違ってるってことはよく分かった。
メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ
言語で例外になるならそれは型安全
お前が型安全の意味を間違ってるってことはよく分かった。
メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ
言語で例外になるならそれは型安全
813デフォルトの名無しさん
2019/12/12(木) 19:44:50.53ID:Vt8W+oPZ ぬるぽ
814デフォルトの名無しさん
2019/12/12(木) 20:29:23.98ID:f2lx0DlC ツンッ
815デフォルトの名無しさん
2019/12/12(木) 20:46:51.94ID:6QhfdrtV >>808
おそらくできると思う
おそらくできると思う
816デフォルトの名無しさん
2019/12/12(木) 22:31:55.78ID:hmkgwwLY boost.property_treeはノードはコンテナだって書いてる。
アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
817デフォルトの名無しさん
2019/12/12(木) 22:36:00.00ID:2qfVB5NM818デフォルトの名無しさん
2019/12/12(木) 22:37:04.02ID:hmkgwwLY 仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。
これはちょっとまずい。
ある部分木の途中からある部分木の途中までを注目することはよくあるから。
これはちょっとまずい。
ある部分木の途中からある部分木の途中までを注目することはよくあるから。
819デフォルトの名無しさん
2019/12/12(木) 22:45:48.06ID:hmkgwwLY ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。
これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
820デフォルトの名無しさん
2019/12/12(木) 22:52:26.39ID:hmkgwwLY 考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。
821デフォルトの名無しさん
2019/12/12(木) 22:59:41.49ID:hmkgwwLY つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。
822デフォルトの名無しさん
2019/12/12(木) 23:02:50.75ID:+RpJiFi7 jsてのは女子小学生の意味か?
823デフォルトの名無しさん
2019/12/12(木) 23:04:10.87ID:hmkgwwLY 型が無いと僕たちには辛すぎるよね。
ミスを発見してくれないから。
ミスを発見してくれないから。
824デフォルトの名無しさん
2019/12/12(木) 23:36:51.22ID:Rc7qy7fw 型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
825デフォルトの名無しさん
2019/12/13(金) 00:21:19.32ID:0IHjBlJG 型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。
呼び出し側が責任を持つということになるのかも。
呼び出し側が責任を持つということになるのかも。
826デフォルトの名無しさん
2019/12/13(金) 00:22:24.50ID:0IHjBlJG 型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
827デフォルトの名無しさん
2019/12/13(金) 06:47:47.05ID:6WB0hlYg828デフォルトの名無しさん
2019/12/13(金) 07:17:35.68ID:0IHjBlJG 機械語は変数に型がない。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
829デフォルトの名無しさん
2019/12/13(金) 07:24:37.08ID:Ry/2QtNy まさにBがCに進化するときの考え方だね
830デフォルトの名無しさん
2019/12/13(金) 09:49:21.00ID:wVkcEFxk >>825
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
831デフォルトの名無しさん
2019/12/13(金) 09:53:03.46ID:wVkcEFxk >>826
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
832デフォルトの名無しさん
2019/12/13(金) 09:53:50.44ID:0IHjBlJG イネーブラ使えば良いのでは。
833デフォルトの名無しさん
2019/12/13(金) 10:00:20.89ID:0IHjBlJG コンセプトコイコイって感じなのかな。
834デフォルトの名無しさん
2019/12/13(金) 11:27:07.79ID:WVlIRY9+ #pragma omp parallel forで
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
835デフォルトの名無しさん
2019/12/13(金) 18:09:24.89ID:e6j7CnOm >C言語には関数の多態性(overload)がない
さらりと嘘をつくやつがおるな
さらりと嘘をつくやつがおるな
836デフォルトの名無しさん
2019/12/13(金) 18:27:30.70ID:fi1/rC5j 今UE4と組み込み以外でc++の仕事あります?
837デフォルトの名無しさん
2019/12/13(金) 18:33:53.16ID:xTSwswyu オーバーロードあるか?
ディスパッチの方法はいろいろあると思うが
ディスパッチの方法はいろいろあると思うが
838デフォルトの名無しさん
2019/12/13(金) 18:55:58.62ID:ftjAwgQI >>836
USのマイクロソフトに行け
USのマイクロソフトに行け
839デフォルトの名無しさん
2019/12/13(金) 19:01:03.38ID:ysGzQi5M >>830
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
840デフォルトの名無しさん
2019/12/13(金) 19:52:22.32ID:6WB0hlYg841デフォルトの名無しさん
2019/12/13(金) 20:00:57.46ID:ysGzQi5M PowrShell は型付言語ですからね。
それぐらいでしょ?
それぐらいでしょ?
842はちみつ餃子 ◆8X2XSCHEME
2019/12/13(金) 20:54:52.57ID:1q9LzdDI 用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
843デフォルトの名無しさん
2019/12/13(金) 21:07:31.92ID:KHLl2/ku844デフォルトの名無しさん
2019/12/13(金) 21:09:15.79ID:wKYhuojH845デフォルトの名無しさん
2019/12/13(金) 21:13:12.55ID:gmdEaqRD それでいいんじゃないの
846デフォルトの名無しさん
2019/12/13(金) 21:23:18.13ID:T1rtAOWF 質問です
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
847デフォルトの名無しさん
2019/12/13(金) 21:37:57.11ID:KHLl2/ku848デフォルトの名無しさん
2019/12/13(金) 22:26:34.23ID:0IHjBlJG >>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;
}
これも通ってしまった。
#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;
}
849デフォルトの名無しさん
2019/12/13(金) 22:27:26.74ID:0IHjBlJG 実行結果。
Start
6
0
Finish
最後の定義が有効になってるように見える。
Start
6
0
Finish
最後の定義が有効になってるように見える。
850デフォルトの名無しさん
2019/12/13(金) 22:28:16.14ID:0IHjBlJG Wandbox
C++
gcc HEAD 10.0.0 2019
C++
gcc HEAD 10.0.0 2019
851デフォルトの名無しさん
2019/12/13(金) 22:54:36.18ID:T1rtAOWF ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
852デフォルトの名無しさん
2019/12/13(金) 22:57:06.09ID:0IHjBlJG 僕もちょっとわからないんだけど。
853デフォルトの名無しさん
2019/12/14(土) 00:21:27.14ID:stptR0oK >>836
デスクトップアプリ
デスクトップアプリ
854デフォルトの名無しさん
2019/12/14(土) 07:31:10.87ID:SZLGcxYz >>846
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
855デフォルトの名無しさん
2019/12/14(土) 08:56:55.09ID:fBoJLlft856デフォルトの名無しさん
2019/12/14(土) 09:02:00.44ID:SZLGcxYz なんでという理由も述べたはずだが
857デフォルトの名無しさん
2019/12/14(土) 09:53:01.66ID:fBoJLlft >>856
だからそれを可能にするようにしてくれ
だからそれを可能にするようにしてくれ
858デフォルトの名無しさん
2019/12/14(土) 10:02:03.90ID:SZLGcxYz ん? 俺は江添じゃねえぞ
奴なら標準会員だから言ってみるのもいいが
奴なら標準会員だから言ってみるのもいいが
859デフォルトの名無しさん
2019/12/14(土) 10:02:27.48ID:SZLGcxYz - 標準会員
+ 標準化委員
+ 標準化委員
860デフォルトの名無しさん
2019/12/14(土) 10:08:29.00ID:yV/FURvf 江添本ダメ絶対
861デフォルトの名無しさん
2019/12/14(土) 10:30:50.58ID:stptR0oK 江添でもできない
862846
2019/12/14(土) 10:35:10.86ID:QUVSvjZy >>854
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
863デフォルトの名無しさん
2019/12/14(土) 12:26:05.30ID:m0rD8Ode ローマ法王は根競べで決めるらしいですよ奥さん。
864デフォルトの名無しさん
2019/12/14(土) 12:26:49.81ID:gw9aL+td 誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
865デフォルトの名無しさん
2019/12/14(土) 12:35:13.30ID:SZLGcxYz866デフォルトの名無しさん
2019/12/14(土) 12:50:37.99ID:gw9aL+td >相場では規格票の条文
通産省の癖の抜けない老人はご退場いただきたい
通産省の癖の抜けない老人はご退場いただきたい
867デフォルトの名無しさん
2019/12/14(土) 12:58:43.25ID:m0rD8Ode これODRの緩和と関係あるんですかね?
868デフォルトの名無しさん
2019/12/14(土) 13:34:08.27ID:T/HCOnVQ >>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
869デフォルトの名無しさん
2019/12/14(土) 13:37:18.74ID:JwYnIOEa870デフォルトの名無しさん
2019/12/14(土) 13:37:51.96ID:T/HCOnVQ といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
871デフォルトの名無しさん
2019/12/14(土) 13:38:24.93ID:T/HCOnVQ >>869
迷信
迷信
872デフォルトの名無しさん
2019/12/14(土) 13:39:11.91ID:JwYnIOEa ソースは?
873デフォルトの名無しさん
2019/12/14(土) 13:39:40.59ID:T/HCOnVQ リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い
そのような保証は無い
874デフォルトの名無しさん
2019/12/14(土) 13:41:05.07ID:JwYnIOEa それのソース
875デフォルトの名無しさん
2019/12/14(土) 13:44:15.66ID:JwYnIOEa876デフォルトの名無しさん
2019/12/14(土) 14:15:12.84ID:JwYnIOEa x86系は
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる
シングルコア時代が長かったから
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる
シングルコア時代が長かったから
877デフォルトの名無しさん
2019/12/14(土) 14:55:10.15ID:QUVSvjZy878デフォルトの名無しさん
2019/12/14(土) 14:57:30.67ID:T/HCOnVQ 確かにリンク先のインテルのマニュアルの
>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
を見たらワカル、
>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
を見たらワカル、
879デフォルトの名無しさん
2019/12/14(土) 15:04:35.33ID:T/HCOnVQ つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか
880デフォルトの名無しさん
2019/12/14(土) 15:10:49.52ID:SZLGcxYz >>877
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
881デフォルトの名無しさん
2019/12/14(土) 15:13:40.23ID:PwUHvw+y お前なぁ
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
882デフォルトの名無しさん
2019/12/14(土) 15:20:09.00ID:T/HCOnVQ そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
883デフォルトの名無しさん
2019/12/14(土) 15:21:14.95ID:k5kIl1RN >>877
× 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?
特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
× 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を分離できないことは納得してるのかな?
そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの?
特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、
明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
884デフォルトの名無しさん
2019/12/14(土) 15:24:42.79ID:QUVSvjZy885デフォルトの名無しさん
2019/12/14(土) 15:32:39.86ID:SZLGcxYz >>884
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
■ このスレッドは過去ログ倉庫に格納されています
