問題タブ [llvm-codegen]

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.

0 投票する
6 に答える
37129 参照

c++ - C++ 標準では、初期化されていない bool がプログラムをクラッシュさせることを許可していますか?

C++ の「未定義の動作」により、コンパイラが必要なことをほとんど実行できることを私は知っています。しかし、コードは十分に安全だと思っていたので、驚くべきクラッシュが発生しました。

この場合、実際の問題は、特定のコンパイラを使用する特定のプラットフォームでのみ発生し、最適化が有効になっている場合にのみ発生します。

問題を再現し、最大限に単純化するために、いくつかのことを試しました。Serializeこれは、bool パラメーターを取り、文字列trueまたはfalse既存の宛先バッファーにコピーするという関数の抜粋です。

この関数はコード レビューに含まれますか? bool パラメーターが初期化されていない値である場合、実際にクラッシュする可能性があることを伝える方法はありませんか?

このコードを clang 5.0.0 + 最適化で実行すると、クラッシュする可能性があります。

予想される三項演算子boolValue ? "true" : "false"は、私にとっては十分に安全に見えましたboolValue

逆アセンブリの問題を示すコンパイラ エクスプローラーの例をセットアップしました。ここに完全な例を示します。注:問題を再現するために、私が見つけた組み合わせは、-O2最適化でClang 5.0.0を使用することです。

この問題はオプティマイザが原因で発生します。文字列「true」と「false」の長さの違いは 1 だけであると推測するのに十分なほど巧妙でした。そのため、長さを実際に計算する代わりに、bool 自体の値を使用する必要があります。技術的には 0 または 1 のいずれかであり、次のようになります。

これは「巧妙」ですが、いわば私の質問は次のとおりです。C++ 標準では、コンパイラは bool が '0' または '1' の内部数値表現のみを持つことができ、そのような方法で使用できると想定できますか?

または、これは実装定義のケースですか。その場合、実装はすべてのブール値が 0 または 1 のみを含み、他の値は未定義の動作領域であると想定していましたか?

0 投票する
1 に答える
372 参照

performance - この Rust コードに分岐予測失敗のペナルティがないのはなぜですか?

私はこの非常に単純な Rust 関数を書きました:

順序付けられた配列とシャッフルされた配列を使用してメソッドを呼び出す基本的なベンチマークを作成しました。

2 つのベンチマークのランタイムがほぼ同じであることに驚いていますが、Java の同様のベンチマークでは、おそらくシャッフルされた場合の分岐予測の失敗が原因で、2 つの明確な違いが示されています。

条件付き移動命令についての言及を見てきましたがotool -tv、実行可能ファイル (Mac で実行している) の場合、iterateメソッドの出力には何も表示されません。

Rust で順序付けされたケースと順序付けられていないケースの間にパフォーマンスの違いが認識できない理由を誰かが明らかにすることはできますか?