問題タブ [gcc6]
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 - GCC-6 の -Wduplicated-cond のような重複をキャッチする方法
タイトルが示すように、すでに知っている人は、このフラグを次のように使用してステートメントGCC-6
で重複をキャッチできます。if
-Wduplicated-cond
出力は次のようになります。
今、私は次のことを知っています:
else if( (a > 4) && (a < 6) )
のように同じではありません
else if( a == 5 )
しかし、同じ条件のチェックを行う場合がありa == 5
ます。
私の質問は、この種の重複を (回避するために) キャッチできる可能性はありますか?
c++ - 名前空間を使用している場合のグローバル スコープの解決
次のコードを検討してください。
このコードは有効ですか? それとも::foo
曖昧ですか?または、 がないなど::foo
の を参照します。class foo
::foo::baz
コンパイラに関してgcc 6.1.1
は、後者を考えるようです:
一方gcc 5.3.1
、、、clang 3.8.0
インテル コンパイラ 16.0.3 では、警告やエラーは発生しません。
C++14 標準の 3.4.3.2.2 の下では、これは有効であり、あいまいではないはずですが、よくわかりません。
編集: さらに、foo::baz mybaz
clang のみがあいまいなエラーを報告します。
c++ - -fsanitize=bounds-strict は GCC 6 の -fsanitize=undefined に含まれていますか?
私は GCC 6 でコンパイルされた C++ ライブラリの問題レポートに取り組んでいます。
- UndefinedBehaviorSanitizer に新しいサニタイズ オプション -fsanitize=bounds-strict が追加されました。これにより、配列境界の厳密なチェックが可能になります。特に、-fsanitize=bounds と、柔軟な配列メンバーのような配列の計測を有効にします。
厳密な境界チェックは に含まれてい-fsanitize=undefined
ますか? -fsanitize=undefined
それともとの両方が必要-fsanitize=bounds-strict
ですか?
c - C 構造体 (gcc) のアトミック ロード/セーブに関する質問
ロックフリーの単一リンクリストの実装を作成するために運を試しています。
これは _Atomic を持つ構造体のすべてのメンバーもアトミックにしますか?
使用法はatomic_loadとatomic_storeが正しいですか?
nvidia - gcc - openacc - コンパイルされたプログラムが正しく機能しない
最近、GCC コミュニティでは、コンパイラで OpenACC をサポートするためのいくつかの取り組みが行われています。だから、私はそれを試してみたかった。
GCC Web サイトのメイン ドキュメントに近いこの段階的なチュートリアル (チュートリアル) を使用して、OpenACC をサポートするGCC 6.1をコンパイルおよびビルドすることができました。
次に、次のコマンドを使用してプログラムをコンパイルしました。
gcc pi.c -fopenacc -foffload=nvptx-none -foffload="-O3" -O3
そして、すべてがエラーなしで進みます。
実行はエラーなしですが、正解はありません。
私のCコードと実行中のプログラムの出力は次のとおりです。
そして、これは実行後の出力a.out
です:
何か案は?
c++ - std::equal は、2 つの小さな std::array のハンドロール ループよりもはるかに遅いのはなぜですか?
大規模なシミュレーションの一部である小さなコードのプロファイリングを行っていましたが、驚いたことに、2 つの配列を要素ごとに比較すると、STL 関数 equal (std::equal) は単純な for ループよりもはるかに遅くなります。私は小さなテスト ケースを作成しました。これは、2 つの間の公正な比較であると信じています。違いは、Debian アーカイブの g++ 6.1.1 を使用することは重要ではありません。符号付き整数の 2 つの 4 要素配列を比較しています。std::equal、operator==、および小さな for ループをテストしました。正確なタイミングには std::chrono を使用しませんでしたが、time ./a.out で違いを明示的に確認できます。
私の質問は、以下のサンプル コードを考えると、なぜ operator== とオーバーロードされた関数 std::equal (これは operator== を呼び出すと思います) が完了するのに約 40 秒かかり、手書きのループは 8 秒しかかからないのですか? ごく最近の Intel ベースのラップトップを使用しています。for ループは、-O1、-O2、-O3、および -Ofast のすべての最適化レベルで高速です。でコードをコンパイルしました
g++ -std=c++14 -Ofast -march=native -mtune=native
肉眼で違いを明確にするためだけに、ループは膨大な回数実行されます。モジュロ演算子は、配列要素の 1 つで安価な操作を表し、コンパイラがループ外で最適化するのを防ぐのに役立ちます。