問題タブ [gcc4]
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++ - -Werror を有効にせずに -Wreturn-type をエラーとして扱うように GCC 4.x に強制しますか?
次のコードがあるとします。
また、GCC バージョン 4.2.1 から options を使用して C++ コンパイラ (C コンパイラではなく) をコンパイルするとします-Wreturn-type -Werror=return-type
。上記の行のコメントを解除せずに上記のコードをそのままコンパイル//#define USE_CXX_CLASS
すると、警告は表示されますが、エラーは表示されません。
しかし、//#define USE_CXX_CLASS
行がコメント解除されている場合、警告はエラーとして扱われます:
はい、1 つは非メンバー関数 (ケース #2) で、もう 1 つは C++ 関数 (ケース #1) です。IMO、それは問題ではありません。両方の条件をエラーとして扱いたいのですが、現時点では-Werror
orを追加したくありません(おそらく後で追加する予定ですが、それはこの質問の範囲外です)。-Wall
私のサブ質問は次のとおりです。
- 私が見逃しているGCCスイッチが機能するはずですか?
#pragma
(いいえ、私は'sを使いたくありません。) - これは、GCC の最新バージョンで対処されたバグですか?
参考までに、私はすでに次のような他の同様の質問に注いでいます。
c++ - ローカル実装へのインターフェース参照
次のコードを検討してください。
GCC 4.4.1 ( を使用-O2
) では、 への呼び出しB::go()
がインライン化されます (つまり、仮想ディスパッチは発生しません)。これは、コンパイラが実際に型変数a_ref
を指していることを認識していることを意味します。参照を使用して を指すことができますB
が、コンパイラはこれが当てはまらないことを予測できるほどスマートであるため、関数呼び出しを完全に最適化し、関数をインライン化します。B
C
すごい!それは信じられないほどの最適化です。
しかし、では、GCC が次のケースで同じことをしないのはなぜでしょうか?
何か案は?他のコンパイラはどうですか?この種の最適化は一般的ですか? (私はこの種のコンパイラの洞察に非常に慣れていないので、興味があります)
2 番目のケースが機能する場合、次のような非常に優れたテンプレートを作成できます。
これらのテンプレートは、多くの場合、仮想ディスパッチを回避するために使用できます。
それを実装することは実用的でしょうか?(そして、それがマイクロ最適化であると言い続けないでください..)
- 編集
static_ptr<>
の問題は、私が公開した問題とは何の関係もないことに気付きました。ポインター型は保持されますが、インライン化されません。static_ptr_container<>::value が参照でもポインターでもないことを確認するために、GCCは必要なほど深くは行かないと思います。申し訳ありません。しかし、その質問はまだ答えられていません。
- 編集
static_ptr<>
実際に動作するバージョンを作成しました。また、名前を少し変更しました。
唯一の弱点は、ユーザーがptr->value
実際のオブジェクトを取得するためにアクセスする必要があることです。オーバーロードoperator ->()
は GCC では機能しません。実際のオブジェクトへの参照を返すメソッドは、それがインラインの場合、最適化を中断します。お気の毒に..
visual-studio-2008-sp1 - 「警告:符号付き整数式と符号なし整数式の比較」と同様のGCC警告をVS2008に発行させる
'int'から'size_t'への変換で説明されたものと同じ行に沿って、結果の符号が変わる可能性があります-GCC、C 、代わりに、GCC4.2.1で受信する警告にもフラグが付けられるようにします32ビットと64ビットの両方のコンパイルでのVS2008SP1では、VS2008に合わせてGCCでの警告を無効にします。
たとえば、64ビット条件下のGCC 4.2.1では、-Wall条件下での警告として次のように表示されます。
GCCの警告は次のとおりです。
ただし、VS2008 SP1 64ビットコンパイラでは、どのタイプのプラグマを試しても、/W3または/W4、または/ w3some_warning_numberまたは/ w4some_warning_numberなどを使用して何を有効にしてもフラグは立てられません。
さて、GCCの警告レベルを下げたり、警告を無効にしたりしたくありません。なぜなら、GCCには非常に正当な理由で警告があったからです。したがって、/ WXが有効になっている場合、VSビルドが同様の方法で失敗するようにしたいと思います。これは私が一緒に暮らさなければならないものですか、それともVS2008でトリックを行う警告がありますか?
編集:警告は、32ビットビルドでは表示されますが、64ビットビルドでは表示されません。以下に示すように、同じコンパイラオプションのセットを使用します。
編集#1:これはVisual Studioの特異性である可能性があるため、Visual C ++ Developer Centerに投稿しました-警告C4018:'<':32ビットでは符号付き/符号なしの不一致が発生しますが、64のVS2008SP1では64ビットのコンパイルでは発生しません-ビットWindows。
編集#2: Visual C++開発者センターの投稿内からMicrosoftConnectに投稿するように指示され、今日(2011-01-11)Microsoftは私の質問に回答し、コンパイラの問題として検証しました:問題が追加されると述べました将来のリリースで修正されるバックログへ:Microsoft Connect-警告C4018:'<':署名付き/署名なしの不一致は同じサイズのタイプ間でのみ発生します。
c++ - multi_index_container をブーストし、タグでインデックスを取得するとコンパイラ エラーが発生する
だから、私は手を出そうとしていてmulti_index_container
、かなり奇妙なコンパイラエラーが発生しています.最初に、私の問題を示す最も簡単な例を示します(おそらく愚かな単純なものが欠けています)...
g++ (gcc 4.4.4、linux) によって報告されるエラーは次のとおりです。
したがって、コンテナをクラステンプレートに変換するまで、これは正常に機能していましたが、その後、このエラーが発生し、理由がわかりません..
どんなアイデアでも大歓迎です...
c++ - ストリームコードをgccにリンクできません
次のコードのコンパイルに問題があります。
コンパイルする:
コンパイルはいくつかの警告を出します:
結果のバイナリは正常に実行されているように見えます。
出力ファイルは作成されますが、空です!?!
問題が何であるかについてのポインタに非常に感謝します。
compiler-optimization - GCC -O2 with -march / -ftree-vectorize
2 つのイメージ ( 2000Hx3000W と 6800Hx8500W ) でソーベル カーネル畳み込みを実行するプログラムに対して、いくつかのコンパイラ スイッチを試しています。私が解釈できない観察結果がいくつかあります。データは次のとおりです - コンパイラ フラグと秒単位の所要時間 (最後の列に注目してください。大きな画像の Y 軸での畳み込みを意味します)。
私が実行しているマシンが AMD barcelona であることを考えると、-O2-march=barcelona が適度に優れていると予想しました。-O2 が -O2 -march よりも優れている理由について何か考えはありますか?
-ftree-vectorize については、私のループは依存関係がないので、命令を並列に実行できるはずです。しかし、 -O2-ftree-vectorize-march=barcelona は、個々にタイミングに合理的な違いがある場合に最適です。
この振る舞いを理解できれば素晴らしいことです。
よろしく、
サヤン
gcc - GCC パッチを適用する方法
GDC 2 をコンパイルするために、このパッチを MinGW 上の GCC に適用しようとしていますが、方法がわかりません。(私はまだ GCC の内部、さらには一般的な *nix ツールについては初心者です。)コマンドがあることは知っていますが、その使用方法がわかりません。十分なコマンドがあるかどうかさえわかりません。このための情報。patch
GCC のパッチを適用するにはどうすればよいですか?
gcc - GCCの問題、2つの異なる(ただし類似した)システムで異なる出力を生成する
プロジェクトの1つで、EAX暗号化にBrianGladmanのライブラリを使用しています。
問題は、コードがローカル開発環境(virtualboxで実行されているUbuntu)で機能するが、Amazon AWSクラウドで実行されているシステムでは同じコードが機能しない(暗号化が正しくない)ことです。
GCCのバージョンと、ローカル環境とクラウドの両方を確認しました。バージョンは同じです:
gccバージョン4.4.5(Ubuntu / Linaro 4.4.4-14ubuntu5)
どのような場合にこれが発生する可能性がありますか?何か案は?
c++ - gcc 4.3 のデフォルト仕様ファイルを設定するには?
gcc バージョン 4.3.2 を使用している場合、以下を使用してスペックを生成する方法を確認できます。
libgcc と同じディレクトリに移動します。
変更可能な入力済みスペック ファイルがあります。ただし、それが完了しても、次のことがわかります。
-specs
コンパイルごとにパラメーターを渡すように強制するのではなく、デフォルトでその仕様ファイルを使用するようにgccに指示するにはどうすればよいですか? 私が持っている別のシステムと一致させたいのですが、次のようになります。
ご覧のとおり、2 つのシステムの主な違いは、既存のセットアップが 32 ビットであり、現在 64 ビット システムでそれを一致させようとしていることです。Linux のバージョンはそれ以外は同じで、同じバージョンの gcc をコンパイルしています。(両方のシステムで、gcc 4.3.2 は 2 番目の gcc インストールであり、4.1.2 は 4.3.2 のコンパイルに使用されます)