タグ付けされた質問 「c++」

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

13
C ++でbigintを実装する方法
プログラミング演習として、C ++でbigintクラスを実装したいと思います。これは、longintより大きい数値を処理できるクラスです。すでにいくつかのオープンソースの実装があることは知っていますが、私は自分で実装したいと思います。私は正しいアプローチが何であるかを感じ取ろうとしています。 一般的な戦略は、数値を文字列として取得し、それをより小さな数値(たとえば、1桁)に分割して配列に配置することであることを理解しています。この時点で、さまざまな比較演算子を実装するのは比較的簡単です。私の主な関心事は、足し算や掛け算などをどのように実装するかです。 実際に機能するコードではなく、一般的なアプローチとアドバイスを探しています。

4
この構造はどのようにしてsizeof == 0を持つことができますか?
sizeofを返す構造を要求する古い投稿があり0ます。評判の高いユーザーから、標準ではタイプや変数のサイズを0にすることはできないという高得点の回答がいくつかあります。私はそれに100%同意します。 しかし、この解決策を提示するこの新しい答えがあります: struct ZeroMemory { int *a[0]; }; 反対票を投じてコメントしようとしていましたが、ここで過ごした時間は、私が100%確信していることさえチェックすることを教えてくれました。だから...驚いたことに、両方とも同じ結果gccをclang示しています:sizeof(ZeroMemory) == 0。さらに、変数のサイズは0次のとおりです。 ZeroMemory z{}; static_assert(sizeof(z) == 0); // Awkward... わぁぁぁぁぁ…? ゴッドボルトリンク これはどのように可能ですか?

4
異なるコンパイラによって呼び出される異なるキャスト演算子
次の短いC ++プログラムについて考えてみます。 #include <iostream> class B { public: operator bool() const { return false; } }; class B2 : public B { public: operator int() { return 5; } }; int main() { B2 b; std::cout << std::boolalpha << (bool)b << std::endl; } 異なるコンパイラでコンパイルすると、さまざまな結果が得られます。Clang3.4とGCC4.4.7ではtrue、を印刷しますが、Visual Studio 2013はを印刷falseし(bool)bます。つまり、で異なるキャスト演算子を呼び出します。規格による正しい動作はどれですか? 私の理解でoperator bool()は、変換は必要ありませんoperator int()が、inttobool変換が必要になるため、コンパイラーは最初のものを選択する必要があります。それでconst何かをしますか、const-conversionはコンパイラによってより「高価」であると見なされますか? を削除するとconst、すべてのコンパイラが等しくfalse出力として生成されます。一方、2つのクラスを組み合わせると(両方の演算子が同じクラスになります)、3つのコンパイラーすべてがtrue出力を生成します。

16
ヘッダーファイルとライブラリの違いは何ですか?
私が理解するのに苦労していることの1つは、コンパイラーがどのように機能するかです。私はそれで多くの問題を抱えていますが、特に私はヘッダーとライブラリを混同し続けています。誰かが少し物事を片付けることができれば、それは素晴らしいことです。
80 c++  c 

6
「if」ステートメントで変数を初期化する
C ++ 17では、次のifようなステートメントで変数を初期化できることを読みました if (int length = 2; length == 2) //execute something の代わりに int length = 2; if (length == 2) //do something 短いですが、コードの可読性に影響します(特に、この新機能を知らない人にとって)。これは、大規模なソフトウェア開発では悪いコーディング方法だと思います。 コードを短くする以外に、この機能を使用する利点はありますか?
80 c++  c++17 

5
QVectorとQList
反復する必要のある整数のリストがありますが、配列が不十分です。どのような違いがあるvectorsとlists、私はタイプを選ぶ前に、私が知っている必要がありますが何ですか? 明確にするために、私はQTドキュメントを読みましたが、これは私が知っていることの範囲です: QList<T>、QLinkedList<T>、およびQVector<T>同様の機能を提供。概要は次のとおりです。 ほとんどの目的で、QListは使用するのに適したクラスです。そのインデックスベースのAPIは、QLinkedList'sイテレータベースのAPIよりも便利であり、通常QVector、アイテムをメモリに格納する方法よりも高速です。また、実行可能ファイル内のコードが少なくなります。 リストの中央に一定時間挿入され、インデックスではなくアイテムへのイテレータが保証された、実際のリンクリストが必要な場合は、を使用しますQLinkedList。 アイテムが隣接するメモリ位置を占めるようにする場合は、を使用しますQVector。
80 c++  qt  list  vector 


8
「符号付き/符号なしの不一致」警告(C4018)に対処するにはどうすればよいですか?
私は、高性能と低メモリオーバーヘッドを念頭に置いて、C ++で記述された多くの計算コードを使用しています。STLコンテナー(ほとんどvector)を頻繁に使用し、ほぼすべての関数でそのコンテナーを反復処理します。 反復コードは次のようになります。 for (int i = 0; i < things.size(); ++i) { // ... } ただし、符号付き/符号なしの不一致の警告が生成されます(Visual StudioのC4018)。 OpenMPプラグマを頻繁に使用するため、intあるunsignedタイプに置き換えることは問題であり、カウンターはint。である必要があります。 私は(数百の)警告を抑制しようとしていますが、問題に対するいくつかのエレガントな解決策を見逃しているのではないかと心配しています。 イテレータについて。イテレータは適切な場所に適用すると素晴らしいと思います。私が使用しているコードは、ランダムアクセスコンテナを何かに変更することはなくlist(したがって、反復処理int iはすでにコンテナに依存しません)、常に現在のインデックスが必要になります。また、入力する必要のあるすべての追加コード(イテレーター自体とインデックス)は、問題を複雑にし、基になるコードの単純さを難読化します。
80 c++  refactoring 

1
依存スコープを持つネストされたテンプレート
依存スコープとは何ですか?次のエラーのコンテキストでのtypenameの意味は何ですか? $ make g++ -std=gnu++0x main.cpp main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector<Data> >::Type' because 'ptrModel<std::vector<Data> >' is a dependent scope make: *** [all] Error 1 /* * main.cpp */ #include <vector> #include <memory> template<typename T> struct ptrModel { typedef std::unique_ptr<T> Type; }; template<typename Data> struct ptrType { typedef ptrModel< std::vector<Data> …
79 c++  templates  scope  nested 

8
64ビット整数のパックされた8ビット整数を並列に1で減算、ハードウェアSIMDなしのSWAR
私が64ビット整数を持っている場合、それを8要素のパックされた8ビット整数の配列として解釈しています。1ある要素の結果が別の要素の結果に影響を与えることなくオーバーフローを処理しながら、各パック整数から定数を減算する必要があります。 私は現在このコードを使用していますが、機能しますが、パックされた各8ビット整数の減算を並列に実行し、メモリアクセスを行わないソリューションが必要です。x86では、psubbパックされた8ビット整数を減算するようなSIMD命令を並列で使用できますが、コーディング対象のプラットフォームはSIMD命令をサポートしていません。(この場合はRISC-V)。 したがって、SWAR(レジスタ内のSIMD)を実行して、のバイト間のキャリー伝播を手動でキャンセルしようとしています。uint64_tこれと同等の処理を実行します。 uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; } return arg; } これはビット演算子で実行できると思いますが、よくわかりません。SIMD命令を使用しないソリューションを探しています。独自のソリューションを実装できるように、非常に移植性のあるCまたはC ++のソリューション、またはその背後にある理論だけを探しています。
77 c++  c  bit-manipulation  simd  swar 

7
値0の代わりにNULLを使用できますか?
NULLの値の代わりにポインタを使用でき0ますか? それとも、そのことについて何か問題がありますか? たとえば、 int i = NULL; の代わりとして: int i = 0; 実験として、次のコードをコンパイルしました。 #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } 出力: 0 確かにそれは私にこの警告を与えます、それ自体は完全に正しいです: warning: initialization makes integer from pointer without a cast [-Wint-conversion] しかし、結果は同じです。 これで「未定義の動作」にぶつかりますか? NULLこのように利用することは許されますか? NULL算術式の数値として使用することに問題はありますか? そして、この場合のC ++の結果と動作は何ですか? 私はの答え読み持っている「\ 0」、NULLの違いは何をして0との違いは何かについてNULL、\0そして0それが正しい使用にも非常に許容され、場合、ですが、私はそこからの簡潔な情報を取得していないNULLとして、代入やその他の算術演算で操作する値。

10
rawメモリのビューとしてstd :: vectorを使用する
私はある時点で整数の配列とサイズへの生のポインタを与える外部ライブラリを使用しています。 ここstd::vectorで、これらの値に直接アクセスして変更するために、生のポインタでアクセスするのではなく、を使用したいと思います。 ポイントを説明する人工的な例はここにあります: size_t size = 0; int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in std::vector<int> v = ????; // pseudo vector to be used to access the raw data std::sort(v.begin(), v.end()); // sort raw data in place for (int i = 0; …
71 c++  c++11  vector  stdvector 

3
マルチスレッド化プログラムは最適化モードのままですが、-O0で正常に実行されます
簡単なマルチスレッドプログラムを次のように記述しました。 static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { auto result=std::async(std::launch::async, func); std::this_thread::sleep_for(std::chrono::seconds(1)); finished=true; std::cout<<"result ="<<result.get(); std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl; } それはでデバッグモードで正常に動作するVisual Studioのか-O0にGC Cとした後、結果をプリントアウト1秒。しかし、スタックモードになり、リリースモードまたはで何も印刷しません-O1 -O2 -O3。

7
「新規」と「削除」はC ++で非推奨になっていますか?
さまざまなサイズの配列宣言に関するクイズに遭遇しました。最初に頭に浮かんだのは、new次のように、コマンドで動的割り当てを使用する必要があるということです。 while(T--) { int N; cin >> N; int *array = new int[N]; // Do something with 'array' delete[] array; } ただし、解決策の1つが次のケースを許可することを確認しました。 while(T--) { int N; cin >> N; int array[N]; // Do something with 'array' } 少し調べた後、g ++でこれが可能であることを読みましたが、それでも、動的割り当てを使用する必要があるのはどのような場合ですか?それとも、コンパイラがこれを動的割り当てとして変換するのでしょうか? 削除機能が含まれています。ただし、ここでの質問はメモリリークに関するものではないことに注意してください。

2
配列のサイズを取得するためのこのテンプレートコードはどのように機能しますか?
なぜこの種のコードはテスト配列のサイズを取得できるのでしょうか。テンプレートの文法に慣れていません。多分誰かが下のコードの意味を説明できるでしょうtemplate<typename,size_t>。また、参照リンクも推奨されます。 #define dimof(array) (sizeof(DimofSizeHelper(array))) template <typename T, size_t N> char(&DimofSizeHelper(T(&array)[N]))[N]; void InitDynCalls() { char test[20]; size_t n = dimof(test); printf("%d", n); }
61 c++  visual-c++ 

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