問題タブ [sequence-points]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C および C++ のシーケンス ポイントが原因で発生した問題はどれですか?
以下は、シーケンス ポイント ルールが原因で未定義の動作が発生する 2 つの一般的な問題です。
シーケンスポイントに関して他に遭遇したことは何ですか?
コンパイラが警告できない場合、これらの問題を見つけるのは非常に困難です。
multithreading - この二重チェック ロックの修正の何が問題になっていますか?
そのため、複数のスレッドが遅延して作成されたシングルトンを初期化しようとするのを防ぐために一般的に使用される C++ の二重チェック ロックが壊れていると主張する多くの記事を見てきました。通常の二重チェック ロック コードは次のようになります。
問題は明らかにインスタンスを割り当てる行です-コンパイラは自由にオブジェクトを割り当ててからそれにポインタを割り当てるか、またはポインタを割り当てられる場所に設定してから割り当てます。後者のケースはイディオムを壊します -- 1 つのスレッドはメモリを割り当ててポインタを割り当てますが、スリープ状態になる前にシングルトンのコンストラクタを実行しません -- 次に、2 番目のスレッドはインスタンスが null ではないことを確認し、それを返そうとします、まだ構築されていませんが。
の代わりにスレッドローカルブール値を使用してチェックするという提案を見ましたinstance
。このようなもの:
このようにして、各スレッドはインスタンスが一度作成されたかどうかをチェックしますが、その後停止します。これにより、パフォーマンスが低下しますが、すべての呼び出しをロックするほど悪くはありません。しかし、ローカルな静的 bool を使用した場合はどうなるでしょうか?:
なぜこれがうまくいかないのですか?sync_check が別のスレッドで割り当てられているときに 1 つのスレッドによって読み取られたとしても、ガベージ値はゼロ以外であり、したがって true になります。この Dr. Dobb の記事では、命令の並べ替えをめぐってコンパイラとの戦いに勝つことはできないため、ロックする必要があると主張しています。これは何らかの理由で機能しないはずだと思いますが、その理由はわかりません。Dr. Dobb の記事にあるように、シーケンス ポイントの要件が失われているとすれば、ロックの後のコードをロックの前に並べ替えることができない理由がわかりません。これにより、C++ マルチスレッドが壊れた期間になります。
ローカル変数であるため、コンパイラが sync_check をロックの前に特別に並べ替えることが許可されていることがわかると思います(静的であっても、参照やポインターを返していません)-しかし、これはまだ解決できます代わりに静的メンバー (事実上グローバル) にすることによって。
それで、これは機能しますか、それとも機能しませんか?なんで?
c++ - コンストラクターが呼び出される前に割り当てを行うことはできますか?
二重チェック ロックのこの修正の何が問題なのですか?へのコメント 言います:
問題は、オブジェクトが割り当てられる前ではなく、コンストラクターが実行される (または完了する) 前に変数が割り当てられる可能性があることです。
コードを考えてみましょう:
より正式な分析を可能にするために、 a = new A をいくつかの操作に分割しましょう。
上記のコメントは本当ですか? もしそうなら、どのような意味ですか? 代入後にコンストラクタを実行できますか? 可能であれば、MT の安全性のために保証された順序が必要な場合、それに対して何ができるでしょうか?
c++ - これは「*ptr++ = *ptr + a」未定義の動作ですか?
ええと、私はこの答えを真剣に必要としているわけではありません。私はただ好奇心旺盛です。
のような式*ptr++ = a
は完全に有効です。なぜなら、2 つのオブジェクトを操作しているからptr
です。*ptr
*ptr++ = *ptr + a
たとえば、次のスニペットを考えてみましょう。
式に関して心配することは何もないと思いますが、関係する*p++ = *p + 32;
シーケンス ポイントについてはわかりません。
c++ - シーケンスポイントのないC++ 11?
ウィキペディアによると、シーケンス ポイントは C++11 では非推奨です。どういう意味ですか?つまり、シーケンス ポイントによる未定義の動作には影響がないということですか?
visual-c++ - 1番目の条件での変数の割り当てと2番目の条件での同じ変数の使用明確に定義されていますか?
これは明確に定義されていますか?
2番目の条件の前に割り当てが実行されることが保証されていないことをどこかで読んだと思います。私が間違っているか、これがCにのみ当てはまる可能性があります
。Googleはこれについて私を助けませんでした。それが私がここで尋ねている理由です:)
c++ - 式の動作:定義済みまたは未定義?
私は次のコードを持っています
私の友人は、それExpression A
は明確に定義された行動をしていると私に言いましたが、彼が正しいかどうかはわかりません。
彼によると、機能はその間にf()
導入するsequence point
ため、動作は明確に定義されています。
誰かが明確にしてください。
PS:実用的な目的でそのようなコードを書くべきではないことを私は知っています。それはただ学ぶことを目的としています。:)
c - p と q が同じオブジェクトを指している場合、「*p = ++(*q)」は未定義ですか?
シーケンス ポイントについて読んだ後、i = ++i
未定義であることを知りました。
では、次のコードはどうでしょうか。
p と q の初期化が何らかの (複雑な) 条件に依存しているとします。そして、それらは上記の場合のように同じオブジェクトを指している可能性があります。何が起こるか?定義されていない場合、どのツールを使用して検出できますか?
編集: 2 つのポインターが同じオブジェクトを指していない場合、C99 制限を使用できますか? それは「厳格」の意味ですか?
c - cのシーケンスポイント
命令型プログラミングのシーケンスポイントは、以前の評価のすべての副作用が実行され、後続の評価からの副作用がまだ実行されていないことが保証される、コンピュータープログラムの実行の任意のポイントを定義します。
これは何を意味するのでしょうか?簡単な言葉で説明してもらえますか?