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

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

2
c ++ 11ラムダは、使用しない変数をキャプチャしますか?
[=]すべてのローカル変数をラムダ内の値でキャプチャすることを示すために使用すると、コピーされる関数内のすべてのローカル変数、またはラムダによって使用されるすべてのローカル変数だけになりますか? したがって、たとえば、私が持っている場合: vector<int> my_huge_vector(100000); int my_measly_int; some_function([=](int i){ return my_measly_int + i; }); my_huge_vectorはラムダで使用していなくてもコピーされますか?
123 c++  lambda  c++11 

30
C ++列挙型を文字列に変換する簡単な方法はありますか?
名前付き列挙型があるとします。 enum MyEnum { FOO, BAR = 0x50 }; 私がググったのは、プロジェクトのすべてのヘッダーをスキャンし、列挙ごとに1つの関数を含むヘッダーを生成するスクリプト(任意の言語)です。 char* enum_to_string(MyEnum t); そして、このようなものの実装: char* enum_to_string(MyEnum t){ switch(t){ case FOO: return "FOO"; case BAR: return "BAR"; default: return "INVALID ENUM"; } } 落とし穴は本当にtypedefされた列挙型と名前のないCスタイルの列挙型です。誰かがこれについて何か知っていますか? 編集:ソリューションは、生成された関数を除いて、ソースを変更しないでください。列挙型はAPI内にあるため、これまでに提案されたソリューションを使用することはオプションではありません。
123 c++  string  enums  scripting 

13
C ++パフォーマンスの課題:整数からstd :: stringへの変換
以下にリンクされているstd :: stringコードに整数のパフォーマンスを超える人はいますか? そこに整数に変換する方法について説明し、いくつかの質問に既にあるstd::stringようなC ++で、この1は、しかし、提供するソリューションのどれも効率的ではありません。 これは、いくつかの一般的なメソッドと競合するためのコンパイル可能なコードです。 stringstreamを使用した「C ++の方法」:http : //ideone.com/jh3Sa sprintf。SO-ersは通常、パフォーマンスを重視する場合に推奨します。http://ideone.com/82kwR 一般的な考えに反しboost::lexical_castて、独自の実装(ホワイトペーパー)がありstringstream、数値挿入演算子を使用しません。この他の質問は悲惨であると示唆しているので、私は本当にそのパフォーマンスを比較してみたいと思います。 そして、デスクトップコンピューターで競争力のある私自身の貢献は、整数モジュロに依存するアルゴリズムとは異なり、組み込みシステムでもフルスピードで実行されるアプローチを示しています。 ベンのアルゴリズム:http : //ideone.com/SsEUW そのコードを使用したい場合は、簡略化されたBSDライセンスの下で使用できるようにします(商用利用が許可され、帰属が必要です)。聞いてください。 最後に、この関数ltoaは非標準ですが広く利用できます。 ltoaバージョン、それを提供するコンパイラを持っている人(ideoneは提供していません):http ://ideone.com/T5Wim パフォーマンス測定値を回答としてすぐに投稿します。 アルゴリズムのルール 少なくとも32ビットの符号付きおよび符号なし整数を10進数に変換するためのコードを提供します。 出力をとして生成しstd::stringます。 スレッド化およびシグナルと互換性のないトリック(たとえば、静的バッファー)はありません。 ASCII文字セットを想定できます。 INT_MIN絶対値を表現できない2の補数マシンでコードをテストしてください。 理想的には、出力はstringstream、http://ideone.com/jh3Saを使用した正規のC ++バージョンと文字ごとに同一である必要がありますが、正しい数値でも問題ないため、明確に理解できるものであれば何でもかまいません。 NEW:比較に必要なすべてのコンパイラーオプションとオプティマイザーオプション(完全に無効化されている場合を除く)を使用できますが、コードは少なくともVC ++ 2010およびg ++でもコンパイルして正しい結果を与える必要があります。 期待される議論 より優れたアルゴリズムに加えて、いくつかの異なるプラットフォームとコンパイラでいくつかのベンチマークを取得したいと思います(標準の測定単位としてMB /秒のスループットを使用しましょう)。私のアルゴリズムのコード(sprintfベンチマークはいくつかのショートカットを使用していることを知っています-現在は修正されています)は、少なくともASCIIの仮定の下で、標準によって明確に定義された動作ですが、出力に対して未定義の動作または入力がある場合無効です。指摘してください。 結論: おそらくそれぞれの実装が異なるため、g ++とVC2010では異なるアルゴリズムが実行さstd::stringれます。VC2010は明らかにNRVOでより良い仕事をしており、戻り値を取り除くことはgccでのみ助けられました。 sprintf桁違いに優れたコードが見つかりました。 ostringstream50倍以上遅れます。 チャレンジの勝者は、gccで自分の速度の350%を実行するコードを生成するuser434507です。SOコミュニティの気まぐれのため​​、以降のエントリはクローズされます。 現在の(最終?)スピードチャンピオンは次のとおりです。 gccの場合:user434507、8倍高速sprintf:http ://ideone.com/0uhhX Visual C ++の場合:Timo、15倍高速sprintf:http : //ideone.com/VpKO3

14
C ++で例外指定子を使用する必要がありますか?
C ++では、例外指定子を使用して、関数が例外をスローする場合とスローしない場合があることを指定できます。例えば: void foo() throw(); // guaranteed not to throw an exception void bar() throw(int); // may throw an exception of type int void baz() throw(...); // may throw an exception of some unspecified type 次の理由により、実際にそれらを使用することに疑問があります。 コンパイラーは、厳密には例外指定子を強制しません。そのため、利点は大きくありません。理想的には、コンパイルエラーが発生するようにします。 関数が例外指定子に違反している場合、標準的な動作はプログラムを終了することだと思います。 VS.Netでは、throw(X)をthrow(...)として扱うため、標準への準拠は強くありません。 例外指定子を使用する必要があると思いますか? 「はい」または「いいえ」で答え、答えを正当化するいくつかの理由を提供してください。

10
ベクトルの最大(または最小)値を取得するにはどうすればよいですか?
C ++でベクターの最大(または最小)値を取得するにはどうすればよいですか? 私はこれについてGoogleでいくつかの解決策を見ましたが、それらのどれも私には意味がありませんでした:( 誰かがベクトルから最大値または最小値を取得する方法を簡単でわかりやすい方法で説明できますか?そして私はそれが配列と多かれ少なかれ同じであると仮定することで間違っていますか? イテレータが必要ですか?私はそれを試しましたmax_elementが、エラーが出続けましたか? vector<int>::const_iterator it; it = max_element(cloud.begin(), cloud.end()); エラー: 'クラウド'のメンバー '開始'の要求、これは非クラスタイプ 'int [10]'です 編集:私は自分自身に答えることができませんでした??? ここに入れます... うわー、速い返事をありがとう!私はそれをこのようにしてしまいました、それは大丈夫だと思いますか? for (unsigned int i = 0; i < cdf.size(); i++) if (cdf[i] < cdfMin) cdfMin = cdf[i]; どこcdfベクトルです。
123 c++  vector  max  min 

7
C ++での「Xは型に名前を付けません」エラー
以下のように宣言した2つのクラスがあります。 class User { public: MyMessageBox dataMsgBox; }; class MyMessageBox { public: void sendMessage(Message *msg, User *recvr); Message receiveMessage(); vector<Message> *dataMessageList; }; gccを使用してコンパイルしようとすると、次のエラーが発生します。 MyMessageBoxがタイプに名前を付けていません
123 c++  windows  types 

9
size_tの定義はどこにありますか?
このタイプで定義された変数が表示されますが、それがどこから来たのかもわかりません。intまたはunsigned intを使用しないのはなぜですか?(他の「類似した」タイプはどうですか?Void_tなど)。
123 c++  c  variables 

7
std :: queue :: popの戻り値が返されないのはなぜですか?
私はこのページを通過しましたが、同じ理由を得ることができません。そこで言及されている 「値をまったく返さず、クライアントがfront()を使用してキューの先頭にある値を検査することを要求する方が賢明です」 しかし、front()から要素を検査するには、その要素を左辺値にコピーする必要もありました。たとえば、このコードセグメントでは std::queue<int> myqueue; int myint; int result; std::cin >> myint; myqueue.push (myint); / *ここで、結果に割り当てられるRHSに一時が作成されます。参照によって返される場合、ポップ操作後に結果が無効になります* / result = myqueue.front(); //result. std::cout << ' ' << result; myqueue.pop(); 5行目で、coutオブジェクトは最初にmyqueue.front()のコピーを作成し、それを結果に割り当てます。だから、違いは何ですか、ポップ機能は同じことをしたかもしれません。
123 c++  stl 

4
C ++プロジェクト構成(gtest、cmake、doxygenを使用)
私はプログラミング全般に慣れていないので、C ++で単純なベクトルクラスを作成することから始めることにしました。ただし、後でワークフローを変更するのではなく、最初から良い習慣を身に付けたいと思います。 現在、ファイルは2つvector3.hppとしかありませんvector3.cpp。このプロジェクトは、私がすべてに慣れるにつれてゆっくりと成長し始め(一般的な線形代数ライブラリーのようになります)、後で人生を楽にするために「標準」プロジェクトレイアウトを採用したいと思います。だから周りを見回した後、私はhppとcppファイルを整理しようとする2つの方法を見つけました、最初のものは: project └── src ├── vector3.hpp └── vector3.cpp そして二番目の存在: project ├── inc │ └── project │ └── vector3.hpp └── src └── vector3.cpp あなたはどちらを勧めますか、そしてその理由は? 次に、コードの単体テストにGoogle C ++ Testing Frameworkを使用したいと思います。かなり使いやすいようです。あなたは、例えば、私のコードでこれをバンドル示唆くださいinc/gtestまたはcontrib/gtestフォルダ?バンドルされている場合、fuse_gtest_files.pyスクリプトを使用して数やファイルを減らすか、そのままにしておくことをお勧めしますか?バンドルされていない場合、この依存関係はどのように処理されますか? テストを書くことになると、これらは一般的にどのように編成されますか?各クラス(test_vector3.cppたとえば)ごとに1つのcppファイルを作成することを考えていましたが、すべてを簡単に一緒に実行できるようにすべて1つのバイナリにコンパイルしましたか? gtestライブラリは一般にcmakeとmakeを使用してビルドされるので、私のプロジェクトもこのようにビルドするのは理にかなっていると思いましたか?次のプロジェクトレイアウトを使用することにした場合: ├── CMakeLists.txt ├── contrib │ └── gtest │ ├── gtest-all.cc │ └── gtest.h ├── docs │ └── Doxyfile …
123 c++  cmake  doxygen  googletest 


13
コンパイル時に1 + 2 + 3 +…+ 1000を計算するようにC#、C ++、またはJavaコンパイラを駆動する方法は?
最近のインタビューで、私は本当に奇妙な質問をされました。インタビュアーは、コンパイラー機能だけを使用して1 + 2 + 3 + ... + 1000をどのように計算できるかと尋ねました。つまり、プログラムを作成して実行することはできませんが、コンパイル中にこの合計を計算し、コンパイルが完了したときに結果を出力するようにコンパイラーを駆動できるプログラムを作成する必要があります。ヒントとして、私はコンパイラーのジェネリックとプリプロセッサー機能を使用できると私に言った。C ++、C#、またはJavaコンパイラを使用できます。何か案は??? この質問は、ここでループを行わずに合計を計算することとは関係ありません。また、合計はコンパイル時に計算する必要があることに注意してください。C ++コンパイラ指令を使用して結果だけを出力することはできません。 投稿された回答の詳細を読んで、C ++テンプレートを使用してコンパイル中に問題を解決することをメタプログラミングと呼びます。これは、C ++言語の標準化の過程でErwin Unruh博士によって偶然発見された手法です。このトピックの詳細については、メタプログラミングのWikiページをご覧ください。Javaアノテーションを使用してJavaでプログラムを作成することは可能であるようです。あなたは見てとることができmaressの下に答えを。 C ++でのメタプログラミングに関する素晴らしい本がこれです。興味があれば見てみる価値があります。 有用なC ++メタプログラミングライブラリは、BoostのMPL this linkです。

10
C ++でのスタックとヒープの適切な使用法
私はしばらくプログラミングをしてきましたが、ほとんどがJavaとC#でした。実際に自分でメモリを管理する必要はありませんでした。私は最近C ++でプログラミングを始めましたが、いつスタックに格納するか、いつヒープに格納するかについて少し混乱しています。 非常に頻繁にアクセスされる変数はほとんど使用されない変数であるスタックとオブジェクトに格納する必要があり、大きなデータ構造はすべてヒープに格納する必要があると私は理解しています。これは正しいですか、それとも間違っていますか?

7
Objective-Cの代わりにCocoaでC ++を使用しますか?
AppleはCarbon 64ビット対応ではないため、C ++およびCocoaフレームワークを使用するアプリケーションを記述したいと思います。C ++は、LinuxおよびWindowsでの実装ではかなりバニラのようですが、Mac OS Xでは、追加のApple固有のコード(Obj-Cラッパーなど)が必要なようです。Appleは開発者にC ++ではなくObjective-Cでの記述を強いているようにも見えますが、私は間違っているかもしれません。 私はMacでクロスプラットフォームを維持しやすいコードを書くためのパスを見つけようとしています。Linux / Windows用のC ++でコードを記述してから、Objective-Cで大部分を書き直す必要があると、非常に非効率になります。 将来サポートされ、XcodeでサポートされるコードをC ++で作成する方法はありますか?また、これが可能であれば、C ++とObjective-CをXcodeでどのように混在させることができますか?ありがとう。

3
このポインタを使用すると、ホットループで奇妙な最適化が解除されます
最近、奇妙な最適化解除に遭遇しました(または最適化の機会を逃しました)。 3ビット整数の配列を8ビット整数に効率的にアンパックするには、この関数を検討してください。ループの繰り返しごとに16の整数をアンパックします。 void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> 9) & 0x7; target[4] = (t >> 12) & 0x7; …

9
自由関数が期待される場所でメンバー関数を渡すにはどうすればよいですか?
問題は次のとおりです。このコードを検討してください。 #include <iostream> class aClass { public: void aTest(int a, int b) { printf("%d + %d = %d", a, b, a + b); } }; void function1(void (*function)(int, int)) { function(1, 1); } void test(int a,int b) { printf("%d - %d = %d", a , b , a - b); …

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