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

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


8
returnステートメントとmain()のexit()
私はステートメントを使用する必要がありますexit()か?個人的には、他の関数を読み取るようなものであり、コードを読んでいるときのフロー制御は(私の意見では)スムーズであると思うので、ステートメントを好みます。また、関数をリファクタリングしたい場合でも、を選択する方が良いと思います。returnmain()returnmain()returnexit() ないexit()何も特別なんreturnではないんか?
197 c++  c  coding-style  return  exit 

7
C ++ 11でメンバー以外の開始関数と終了関数を使用する理由
すべての標準コンテナには、そのコンテナのイテレータを返すためのbeginおよびendメソッドがあります。ただし、C ++ 11には、と呼ばれる無料の関数と、およびのメンバー関数を呼び出すことが明らかに導入されstd::beginてstd::endいます。だから、書く代わりにbeginend auto i = v.begin(); auto e = v.end(); あなたは書くでしょう auto i = std::begin(v); auto e = std::end(v); Herb Sutterは、彼の講演「Writing Modern C ++」で、コンテナーの開始イテレーターまたは終了イテレーターが必要な場合は常に無料の関数を使用する必要があると述べています。しかし、なぜあなたがそうしたいのかについて彼は詳細には触れません。コードを見ると、1つの文字をすべて節約できます。したがって、標準のコンテナに関する限り、無料の関数はまったく役に立たないようです。Herb Sutterは、非標準のコンテナにはメリットがあると述べましたが、ここでも詳細には触れませんでした。 では、問題は、の無料の関数バージョンが正確に何でstd::beginありstd::end、対応するメンバー関数のバージョンを呼び出す以外に何をするのか、そしてなぜそれらを使用したいのでしょうか?

4
C ++標準では、iostreamのパフォーマンスの低下が義務付けられていますか?それとも、貧弱な実装を扱っているだけですか?
C ++標準ライブラリのiostreamのパフォーマンスが遅いことに言及するたびに、信じられないような波に遭遇します。それでも、iostreamライブラリコード(コンパイラの完全な最適化)に費やされた大量の時間を示すプロファイラー結果があり、iostreamからOS固有のI / O APIおよびカスタムバッファー管理に切り替えると、桁違いに改善されます。 C ++標準ライブラリはどのような追加の作業を行っていますか、それは標準で必要とされていますか、それは実際に役立ちますか?あるいは、一部のコンパイラーは、手動バッファー管理と競合するiostreamの実装を提供していますか? ベンチマーク 問題を解決するために、iostreamの内部バッファリングを実行する短いプログラムをいくつか作成しました。 バイナリデータをostringstream http://ideone.com/2PPYwに配置する バイナリデータをchar[]バッファに入れるhttp://ideone.com/Ni5ct http://ideone.com/Mj2Fivector<char>を使用してバイナリデータをback_inserter NEW:vector<char>シンプルなイテレーターhttp://ideone.com/9iitv NEW:バイナリデータをhttp://ideone.com/qc9QAに直接配置stringbuf NEW:vector<char>単純なイテレーターと境界チェックhttp://ideone.com/YyrKy ostringstreamとstringbufバージョンは、実行速度が非常に遅いため、実行される反復が少ないことに注意してください。 ideoneに、ostringstreamよりも約3倍遅いstd:copy+ back_inserter+ std::vector、および約15倍より遅いmemcpy生バッファへ。これは、実際のアプリケーションをカスタムバッファリングに切り替えたときのプロファイリング前後のプロファイルと一致しています。 これらはすべてメモリ内バッファーであるため、iostreamの速度が遅いディスクI / O、過度のフラッシュ、stdioとの同期、またはC ++標準ライブラリーの観察された速度の遅さを弁解するために使用するその他のものに起因するものではありません。 iostream。 他のシステムのベンチマークや、一般的な実装(gccのlibc ++、Visual C ++、Intel C ++など)が行うこと、および標準によってどの程度のオーバーヘッドが義務付けられているかについての解説を見るとよいでしょう。 このテストの根拠 多くの人々は、フォーマットされた出力にはiostreamがより一般的に使用されていると正しく指摘しています。ただし、これらは、バイナリファイルアクセス用のC ++標準によって提供される唯一の最新のAPIでもあります。しかし、内部バッファリングでパフォーマンステストを実行する本当の理由は、一般的なフォーマット済みI / Oに当てはまります:iostreamがディスクコントローラーにrawデータを供給できない場合、フォーマットを担当しているときに、どのようにして対応できるでしょうか? ベンチマークのタイミング これらはすべて、外側の(k)ループの反復ごとです。 ideone(gcc-4.3.4、不明なOSおよびハードウェア): ostringstream:53ミリ秒 stringbuf:27ミリ秒 vector<char>およびback_inserter:17.6ミリ秒 vector<char> 通常のイテレータの場合:10.6 ms vector<char> イテレータと境界チェック:11.4 ms char[]:3.7ミリ秒 私のラップトップ(Visual …

7
C ++でのネストされた型/クラスの前方宣言
最近、次のような状況で行き詰まりました。 class A { public: typedef struct/class {...} B; ... C::D *someField; } class C { public: typedef struct/class {...} D; ... A::B *someField; } 通常、クラス名を宣言できます。 class A; ただし、ネストされた型を転送宣言することはできません。次の場合はコンパイルエラーが発生します。 class C::D; 何か案は?


30
C ++でビッグエンディアンとリトルエンディアンの値を変換するにはどうすればよいですか?
C ++でビッグエンディアンとリトルエンディアンの値を変換するにはどうすればよいですか? 編集:わかりやすくするために、1つのCPUアーキテクチャから別のCPUアーキテクチャにバイナリデータ(倍精度浮動小数点値と32ビットおよび64ビット整数)を変換する必要があります。これはネットワーキングを含まないため、ntoh()および類似の関数はここでは機能しません。 編集#2:私が受け入れた答えは、対象としているコンパイラに直接適用されます(そのため、私はそれを選択しました)。ただし、他にも非常に優れた、より移植性の高い答えがあります。
196 c++  endianness 

17
ヘッダーファイルにC ++定義を配置することは良い習慣ですか?
C ++での私の個人的なスタイルでは、常にクラス宣言をインクルードファイルに、定義を.cppファイルに配置する必要があります。これは、C ++ヘッダーファイルに対するLokiの回答、コード分離で規定されているものと非常によく似ています。確かに、このスタイルが好きな理由の1つは、Modula-2とAdaのコーディングに費やしたすべての年に関係していると考えられます。 私よりもC ++に精通している同僚がいます。その同僚は、可能な場合はすべてのC ++宣言に定義をヘッダーファイルに含めるべきだと主張しています。彼はこれが有効な代替スタイルであると言ったり、わずかに優れたスタイルであるとは言っていませんが、むしろこれは誰もが現在C ++に使用している、広く受け入れられている新しいスタイルです。 私は以前ほどのぼんやりしているわけではないので、彼と一緒に何人か他の人がいるのを見るまで、彼のこのバンドワゴンに引っかかるのを本当に心配していません。それで、このイディオムは本当にどれほど一般的ですか? ただ、答えにいくつかの構造を与えるために:それは今の道は珍しく、やや一般的な、非常に一般的な、またはバグアウトクレイジー?

2
Cでの&&&操作とは
#include <stdio.h> volatile int i; int main() { int c; for (i = 0; i < 3; i++) { c = i &&& i; printf("%d\n", c); } return 0; } 上記を使用してコンパイルされたプログラムの出力は次のとおりgccです。 0 1 1 と-Wallや-Waddressオプション、gcc警告を発行します。 warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress] c上記のプログラムでどのように評価されていますか?

9
staticキーワードとC ++でのさまざまな使用法
キーワードstaticはC ++でいくつかの意味を持つものですが、私は非常に混乱し、実際にどのように機能するのかを気にすることはありません。 私が理解していることからstatic、ストレージ期間があります。これは、グローバルの場合、プログラムの存続期間中持続することを意味しますが、ローカルについて話すとき、それはデフォルトでゼロに初期化されることを意味します。 C ++標準は、キーワードを持つクラスデータメンバーに対してこれを述べていますstatic。 3.7.1静的ストレージ期間[basic.stc.static] 3キーワードstaticを使用して、静的ストレージ期間を持つローカル変数を宣言できます。 4クラス定義のクラスデータメンバーにキーワードstaticを適用すると、データメンバーに静的ストレージ期間が与えられます。 ローカル変数とはどういう意味ですか?それは関数ローカル変数ですか?関数をローカルで宣言すると、関数staticは一度だけ初期化されるため、最初にこの関数に入る場合もあります。 また、クラスメンバーに関してストレージ期間についてのみ話します。インスタンス固有ではstaticないのはどうですか。それはまた、noのプロパティですか?それとも保管期間ですか? ではstatic、ファイルスコープの場合はどうでしょうか。すべてのグローバル変数は、デフォルトで静的ストレージ期間があると見なされますか?以下(セクション3.7.1から)はそう示しているようです。 1動的ストレージ期間がなく、スレッドストレージ期間がなく、ローカルでないすべての変数は、静的ストレージ期間を持ちます。これらのエンティティのストレージは、プログラムの期間中継続します(3.6.2、3.6.3)。 static変数のリンケージにはどのように関係しますか? この全体のstaticキーワードは、紛れも誰かがそれ英語のためのさまざまな用途を明確にしても私に言うことができ、混乱している時に初期化するためにstatic、クラスのメンバーを?
195 c++  static 

8
Visual Studioのデフォルトでプロジェクトから安全な警告(_CRT_SECURE_NO_WARNINGS)を削除する
scanf()などの関数を使用するときに表示されるプリコンパイラの安全な警告をすべてのプロジェクトにデフォルトで設定する方法はありますか?プロジェクトオプションまたは#define _CRT_SECURE_NO_WARNINGSコードの先頭にa を追加することでそれを実行できることがわかりました。 私はプログラミングコンテストを解決するための新しいプロジェクトを繰り返し作成していることに気づき、追加するのは本当に面倒です(そして貴重な時間がかかります)。 #ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif コードの最初、または新しいプロジェクトを開始するたびにプリコンパイラオプションで設定する。

7
GCCのすべての警告を(文字通り)オンにする方法は?
文字通り、GCCが提供するすべての警告を有効にしたいと思います。(それは簡単だと思います...) あなた-Wallはトリックをするかもしれないと思うでしょうが、いいえ!まだ必要-Wextraです。 あなた-Wextraはトリックをするかもしれないと思うでしょうが、いいえ!これによって、ここにリストされているすべての警告(たとえば、-Wshadow)が有効になるわけではありません。そして、このリストが包括的であるかどうかはまだわかりません。 GCCにすべての警告を有効にするように指示するにはどうすればよいですか(if、and、およびnoです!)。


3
「std :: cout」への未定義の参照
これを例にしましょう: #include <iostream> using namespace std; int main() { cout << "Hola, moondo.\n"; } それはエラーを投げます: gcc -c main.cpp gcc -o edit main.o main.o: In function `main': main.cpp:(.text+0xa): undefined reference to `std::cout' main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference …
194 c++  c++11  gcc  cout 


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