問題タブ [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.

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

c - GCC-6 の -Wduplicated-cond のような重複をキャッチする方法

タイトルが示すように、すでに知っている人は、このフラグを次のように使用してステートメントGCC-6で重複をキャッチできます。if-Wduplicated-cond

出力は次のようになります。

今、私は次のことを知っています:

else if( (a > 4) && (a < 6) )

のように同じではありません

else if( a == 5 )

しかし、同じ条件のチェックを行う場合がありa == 5ます。

私の質問は、この種の重複を (回避するために) キャッチできる可能性はありますか?

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

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 mybazclang のみがあいまいなエラーを報告します。

0 投票する
0 に答える
593 参照

c++ - -fsanitize=bounds-strict は GCC 6 の -fsanitize=undefined に含まれていますか?

私は GCC 6 でコンパイルされた C++ ライブラリの問題レポートに取り組んでいます

  • UndefinedBehaviorSanitizer に新しいサニタイズ オプション -fsanitize=bounds-strict が追加されました。これにより、配列境界の厳密なチェックが可能になります。特に、-fsanitize=bounds と、柔軟な配列メンバーのような配列の計測を有効にします。

厳密な境界チェックは に含まれてい-fsanitize=undefinedますか? -fsanitize=undefinedそれともとの両方が必要-fsanitize=bounds-strictですか?

0 投票する
2 に答える
489 参照

c - C 構造体 (gcc) のアトミック ロード/セーブに関する質問

ロックフリーの単一リンクリストの実装を作成するために運を試しています。

これは _Atomic を持つ構造体のすべてのメンバーもアトミックにしますか?

使用法はatomic_loadとatomic_storeが正しいですか?

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

nvidia - gcc - openacc - コンパイルされたプログラムが正しく機能しない

最近、GCC コミュニティでは、コンパイラで OpenACC をサポートするためのいくつかの取り組みが行われています。だから、私はそれを試してみたかった。

GCC Web サイトのメイン ドキュメントに近いこの段階的なチュートリアル (チュートリアル) を使用して、OpenACC をサポートするGCC 6.1をコンパイルおよびビルドすることができました。

次に、次のコマンドを使用してプログラムをコンパイルしました。

gcc pi.c -fopenacc -foffload=nvptx-none -foffload="-O3" -O3

そして、すべてがエラーなしで進みます。

実行はエラーなしですが、正解はありません。

私のCコードと実行中のプログラムの出力は次のとおりです。

そして、これは実行後の出力a.outです:

何か案は?

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

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 つで安価な操作を表し、コンパイラがループ外で最適化するのを防ぐのに役立ちます。