タグ付けされた質問 「gcc」

GCCはGNUコンパイラコレクションです。Linux上のC、C ++、Go、Fortran、Adaの事実上の標準コンパイラであり、他の多くの言語やプラットフォームもサポートしています。コンパイラとは別に、GCCにはいくつかのプラットフォームやシステムで広く使用されているツールチェーン(libc、libstdc ++、objdump、nmなど)があります。

5
少しブール値と比較する
私がuint16_tでエンコードされたフラグのセットを持っているとしましょうflags。たとえば、AMAZING_FLAG = 0x02。今、私には機能があります。この関数は、フラグを変更するかどうかを確認する必要があります。変更する場合は、フラッシュに書き込む必要があるためです。そしてそれは高価です。したがって、flags & AMAZING_FLAGがに等しいかどうかを確認するチェックが必要ですdoSet。これが最初のアイデアです。 setAmazingFlag(bool doSet) { if ((flags & AMAZING_FLAG) != (doSet ? AMAZING_FLAG : 0)) { // Really expensive thing // Update flags } } これは、直感的なifステートメントではありません。次のようなより良い方法があるはずだと思います。 if ((flags & AMAZING_FLAG) != doSet){ } しかし、これは、実際に仕事をしないtrueに等しくなるように思えます0x01。 それで、少しをブール値と比較するためのきちんとした方法はありますか?

1
このコードがg ++でコンパイルするのにとても時間がかかるのはなぜですか?
次のコードを検討してください。 template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } 次のBashコマンドでg ++によるコンパイルをベンチマークするとき(g ++ 8.3.0を使用) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null done 次の出力が表示されます。 1,0.03 2,0.03 …

4
コンパイラのビルトインを使用せずにオーバーフローセーフな追加を効率的に計算するCスニペットはありますか?
intオーバーフローが発生すると失敗する、別のに追加するC関数を次に示します。 int safe_add(int *value, int delta) { if (*value >= 0) { if (delta > INT_MAX - *value) { return -1; } } else { if (delta < INT_MIN - *value) { return -1; } } *value += delta; return 0; } 残念ながら、GCCやClangでは十分に最適化されていません。 safe_add(int*, int): movl (%rdi), %eax testl %eax, …

1
山かっこのGCCの実装には次のものが含まれます。なぜそれは以下に説明されているとおりでなければならないのですか?
このドキュメントのセクション2.6計算済みインクルードには、次の段落があります。 行が<トークンで始まり、>トークンを含むトークンストリームに展開される場合、<と最初の>の間のトークンが結合されて、含まれるファイル名が形成されます。トークン間の空白は1つのスペースに削減されます。その後、最初の<の後のスペースは保持されますが、閉じる>の前のスペースは無視されます。CPPは山かっこインクルードのルールに従ってファイルを検索します。 これは実装で定義されていることはわかっていますが、なぜGCCにとってこのようにする必要があるのですか?上記の強調表示された文を具体的に参照しています。 編集 上で引用したものの前の3番目の段落が次のことを言っていることに気づきました。 マクロを定義するときは注意が必要です。#defineテキストではなくトークンを保存します。プリプロセッサは、マクロがの引数として使用されることを知る方法がない#includeため、ヘッダー名ではなく通常のトークンを生成します。文字列定数に十分近い二重引用符を含むインクルードを使用する場合、これが問題を引き起こすことはほとんどありません。 ただし、山括弧を使用すると、問題が発生する可能性があります。 ここでどんな問題が指摘されているか知っていますか?
11 c++  c  gcc  language-lawyer 

2
IBMサンプルコード、非再入可能関数がシステムで機能しない
プログラミングの再入学を勉強していました。IBMのこのサイト(本当に良いサイト)。以下にコピーしたコードを見つけました。これは、ウェブサイトに登場する最初のコードです。 コードは、「危険なコンテキスト」で絶えず変化する2つの値を出力することにより、テキストプログラムの非線形開発(非同期)で変数への共有アクセスに関する問題を示します。 #include <signal.h> #include <stdio.h> struct two_int { int a, b; } data; void signal_handler(int signum){ printf ("%d, %d\n", data.a, data.b); alarm (1); } int main (void){ static struct two_int zeros = { 0, 0 }, ones = { 1, 1 }; signal (SIGALRM, signal_handler); data = zeros; alarm …
11 c  gcc  signals  x86-64  data-race 

1
コンパイラが呼び出し先に保存されたレジスタの使用をここで主張するのはなぜですか?
次のCコードを考えてみます。 void foo(void); long bar(long x) { foo(); return x; } -O3またはのいずれかを使用してGCC 9.3でコンパイルすると-Os、次のようになります。 bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret clangからの出力は、呼び出し先保存レジスタとしてではrbxなく選択することを除いて同じですr12。 しかし、私はこのように見えるアセンブリを見たいと思っています/期待しています: bar: push rdi call foo pop rax ret 英語では、これが私の目に見えるものです。 呼び出し先が保存したレジスタの古い値をスタックにプッシュします x呼び出し先が保存したレジスタに移動します コール foo 移動しx、戻り値レジスタに呼び出し先保存レジスタから スタックをポップして、呼び出し先が保存したレジスタの古い値を復元します 呼び出し先に保存されたレジスターをいじる必要がないのはなぜですか?代わりにこれを行わないのはなぜですか?それはより短く、よりシンプルで、おそらくより高速に見えます: xスタックにプッシュ コール foo xスタックから戻り値レジスタにポップ 私の組み立ては間違っていますか?余分なレジスタをいじるよりも効率が悪いのでしょうか?これらの両方に対する答えが「いいえ」である場合、GCCまたはclangのいずれかがこのようにしないのはなぜですか? …
10 c  gcc  assembly  clang  x86-64 

3
nullptrをuintptr_tに変換できますか?異なるコンパイラは同意しません
このプログラムを考えてみましょう: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } msvc v19.24でコンパイルできませんでした: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: 't': …
10 c++  c++11  gcc  visual-c++  clang 

1
テンプレートテンプレートクラスでのGCC / C ++ 17の問題
次の2つのオーバーロードを検討してください template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } 1つ目は通常のクラスで機能し、2つ目はインスタンス化されていないテンプレートで機能します。例えば: std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ここで、次のテンプレート関数を考えます。 template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } }; return test<A>(); …
10 c++  templates  gcc  clang  c++17 

1
GCCでのunordered_map :: insert KeyEqual例外時のメモリリーク-強力な例外安全性保証に違反していますか?
私はGCC 7.3.1を使用していますが、coilluでもテストされています。これはバージョン9.2.0だと思います。以下を使用してビルドします。 g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp ここにありrai.cppます: #include <iostream> #include <unordered_map> int main() { try { struct MyComp { bool operator()(const std::string&, const std::string&) const { throw std::runtime_error("Nonono"); } }; std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap; mymap.insert(std::make_pair("Hello", "There")); mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare } catch (const std::exception& e) { …

2
異なるC ++コンパイラ間での自動型の推測の不一致
だから、私はドット積を実装しようとしています( https://en.wikipedia.org/wiki/Dot_product)を最新のC ++のいくつかのフレーバーで、次のコードを考え出しました: #include <iostream> template<class... Args> auto dot(Args... args) { auto a = [args...](Args...) { return [=](auto... brgs) { static_assert(sizeof...(args) == sizeof...(brgs)); auto v1 = {args...}, i1 = v1.begin(); auto v2 = {brgs...}, i2 = v2.begin(); typename std::common_type<Args...>::type s = 0; while( i1 != v1.end() && i2!= v2.end()) { …

2
voidポインター(void *)が2つのデータ型の1つであるかどうかを確認するにはどうすればよいですか?
2 type秒のパラメーターを受け入れたい関数を書いています。 A string(char *) A structureにはn個の要素があります。 そして、これを達成するためにvoid *、パラメーターとして単純なタイプを使用することを考えています。しかし、私はパラメータがどちらかのタイプであるかどうかを安全に確認する方法がわかりません。
10 c  gcc  types  clang 

1
CHAR_WIDTHが宣言されていません
‘CHAR_WIDTH’ undeclared この単純なプログラムをコンパイルしようとすると、エラーが発生 します。 #include <stdio.h> #include <limits.h> int main() { printf("CHAR_BIT = %d\n", CHAR_BIT); printf("CHAR_WIDTH = %d\n", CHAR_WIDTH); return (0); } と gcc ./show_char_width.c -o show_char_width およびgcc:GNU C17(Ubuntu 8.3.0-6ubuntu1)バージョン8.3.0(x86_64-linux-gnu)、GNU Cバージョン8.3.0、GMPバージョン6.1.2、MPFRバージョン4.0.2、MPCバージョン1.1.0でコンパイル、islバージョンisl-0.20-GMP、カーネル:5.0.0-37-generic。 ここで述べたように、 CHAR_WIDTHはプログラムに含まれているlimits.hで定義する必要があります。では、なぜこのエラーが発生するのですか? では-vオプション私は、ライブラリは、これらのディレクトリで検索されますことを見出しました。 #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed /usr/include/x86_64-linux-gnu /usr/include / …
9 c  gcc 

4
Cコンパイラがスイッチを最適化する理由と異なる場合
最近、奇妙な問題に遭遇したとき、私は個人的なプロジェクトに取り組んでいました。 非常にタイトなループでは、0〜15の値の整数があります。値0、1、8、9の場合は-1を取得し、値4、5、12、13の場合は1を取得する必要があります。 私はいくつかのオプションを確認するためにgodboltを使用しましたが、コンパイラーがifチェーンと同じ方法でswitchステートメントを最適化できないようであることに驚きました。 リンクはここにあります:https://godbolt.org/z/WYVBFl コードは次のとおりです。 const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0}; int a(int num) { return lookup[num & 0xF]; } int b(int num) { num &= 0xF; if (num == 0 || num == 1 || …

4
「戻る」コマンドなしで戻る
gccでコンパイルされたCプログラミング言語、WSLのターミナルbash 配列内で最小の数を見つけるために再帰関数を記述しましたが、これは問題なく機能します。 /*01*/ int minimo(int array[], int n) /*02*/ { /*03*/ static int min = 0; /*04*/ /*05*/ if (n == N) /*06*/ { /*07*/ return array[n-1]; /*08*/ } /*09*/ else /*10*/ { /*11*/ min = minimo(array, n+1); /*12*/ if(array[n]<min){ /*13*/ min = array[n]; /*14*/ } /*15*/ } /*16*/ } …

2
Constオーバーロードがgccで予期せず呼び出されました。コンパイラのバグまたは互換性の修正?
charおよびconst char配列のテンプレートのオーバーロードに依存する、はるかに大きなアプリケーションがあります。gcc 7.5、clang、およびビジュアルスタジオでは、以下のコードはすべてのケースで「NON-CONST」を出力します。ただし、gcc 8.1以降の場合、出力は次のようになります。 #include <iostream> class MyClass { public: template <size_t N> MyClass(const char (&value)[N]) { std::cout << "CONST " << value << '\n'; } template <size_t N> MyClass(char (&value)[N]) { std::cout << "NON-CONST " << value << '\n'; } }; MyClass test_1() { char buf[30] = "test_1"; return …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.