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

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

2
C ++の初期割り当てがCの割り当てよりもはるかに大きいのはなぜですか?
同じコードを使用する場合、コンパイラーを(CコンパイラーからC ++コンパイラーに)変更するだけで、割り当てられるメモリの量が変わります。これがなぜなのかよくわからないので、もっと理解したいと思います。これまでのところ、私が得た最良の応答は「おそらくI / Oストリーム」です。これはあまり説明的ではなく、C ++の「使用しないものにお金を払わない」という側面について疑問に思います。 ClangコンパイラとGCCコンパイラのバージョン7.0.1-8と8.3.0-6をそれぞれ使用しています。私のシステムは最新のDebian 10(Buster)で実行されています。ベンチマークはValgrind Massifを介して行われます。 #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } 使用されるコードは変更されませんが、CまたはC ++のどちらでコンパイルしても、Valgrindベンチマークの結果が変更されます。ただし、値はコンパイラ間で一貫しています。プログラムの実行時割り当て(ピーク)は次のようになります。 GCC(C):1,032バイト(1 KB) G ++(C ++):73,744バイト(〜74 KB) Clang(C):1,032バイト(1 KB) Clang ++(C ++):73,744バイト(〜74 KB) コンパイルには、次のコマンドを使用します。 clang -O3 -o c-clang ./main.c gcc -O3 -o c-gcc ./main.c clang++ -O3 -o cpp-clang ./main.cpp g++ -O3 …
138 c++  c  benchmarking 

13
C ++でクラスをシリアル化および逆シリアル化することは可能ですか?
C ++でクラスをシリアル化および逆シリアル化することは可能ですか? 私は3年間Javaを使用してきましたが、その言語ではシリアライゼーション/デシリアライゼーションはかなり簡単です。C ++には同様の機能がありますか?シリアル化を処理するネイティブライブラリはありますか? 例が参考になります。
138 c++  serialization 

13
C ++に別のヘッダーファイルが必要なのはなぜですか?
C ++が.cppファイルと同じ機能を持つ別のヘッダーファイルを必要とする理由を本当に理解したことがありません。クラスの作成とそれらのリファクタリングが非常に困難になり、プロジェクトに不要なファイルが追加されます。そして、ヘッダーファイルをインクルードする必要があるという問題がありますが、すでにインクルードされているかどうかを明示的に確認する必要があります。 C ++は1998年に承認されましたが、なぜこのように設計されているのですか?別のヘッダーファイルを持つことにはどのような利点がありますか? フォローアップの質問: 含めるコードがすべて.hファイルの場合、コンパイラーはコードが含まれている.cppファイルをどのように見つけますか?.cppファイルが.hファイルと同じ名前であると想定していますか、それとも実際にディレクトリツリー内のすべてのファイルを調べていますか?

6
静的ライブラリを他の静的ライブラリにリンクする
多くの静的ライブラリ(a_1-a_n)に依存する小さなコードがあります。そのコードを静的ライブラリにパッケージ化して、他の人が利用できるようにしたいと考えています。 私の静的ライブラリは、Xと呼んでも問題なくコンパイルされます。 Xの関数を使用する簡単なサンプルプログラムを作成しましたが、Xにリンクしようとすると、ライブラリa_1-a_nからシンボルが欠落しているという多くのエラーが発生します。 XとXに必要なすべての機能(a_1-a_nから選択されたビット)を含む新しい静的ライブラリYを作成して、プログラムをリンクする人々にYだけを配布できる方法はありますか? 更新: 私はarですべてをダンプして1つのメガライブラリを作成することだけを見てきましたが、必要のない多くのシンボルが含まれます(すべての.oファイルは約700 MBですが、静的にリンクされた実行可能ファイルは7です) MB)。実際に必要なものだけを含める良い方法はありますか? これは、複数のC / C ++ライブラリを1つに結合する方法に密接に関連しているように見えますか?。
138 c++  linker  ar  .a 

11
C ++での関数の実行時間の測定
特定の関数がC ++プログラムでLinuxで実行されるのにかかる時間を調べたい。その後、速度比較をしたいと思います。私はいくつかの時間機能を見ましたが、ブーストからこれで終わりました。クロノ: process_user_cpu_clock, captures user-CPU time spent by the current process さて、上記の関数を使用するかどうか明確ではありませんが、CPUがその関数に費やした唯一の時間を取得できますか? 次に、上記の関数を使用した例が見つかりませんでした。上記の機能の使い方を教えてもらえますか? PS:現在、私はstd::chrono::system_clock::now()時間を秒単位で取得するために使用していますが、これは毎回異なるCPU負荷のために異なる結果を与えます。

9
&&と||をオーバーロードする理由は実際にありますか?短絡しませんか?
短絡演算子の振る舞い&&とは、||プログラマのための素晴らしいツールです。 しかし、なぜオーバーロードするとこの動作が失われるのですか?演算子は関数の単なる構文糖であると理解していますが、演算子にboolはこのような振る舞いがあります。なぜこの単一の型に制限する必要があるのですか?この背後に技術的な理由はありますか?

3
Qt for Visual Studio 2010をビルドする方法
Visual Studio 2010でQtを使用するための安定したソリューションを提供するハウツーを見つけるのに苦労したので、すべての情報といくつかの試行錯誤を収集した後、自分のソリューションをガイドに書きたいと思います。 問題、またはビルド済みのバイナリを使用できないのはなぜですか? Visual Studio 2008用にビルドされたバイナリを使用すると、いくつかの特別なケースでは機能するようですが、機能しないことがわかりました。私の場合、問題なくコンパイルされましたが、次のようなランタイムエラーが発生します。 またはVisual Studio 2010から起動した場合: 更新:なぜそれが一部の人には効果があるのか​​、他の人には効果がないのかを分析しているブログ投稿を見つけました。つまり、同じマシンにVisual Studio 2008がインストールされているかどうかによって異なります。 http://blog.paulnettleship.com/2010/11/11/troubleshooting-visual-studio-2010-and-qt-4-7-integration/ 最も重要なこと(私が愚かに気付かなかったこと)は、Visual Studio 2008がインストールされていない場合、Visual Studio 2008のコンパイル済みライブラリとDLL(Qt Webページで入手可能)を使用できないことです。その理由は、ダウンロードしたQt SDKはVC9.0 DebugCRTに依存するデバッグビルドであるため、再配布可能なインストーラーとしては入手できないVisual C ++ 2008 Debug Runtimeがインストールされている必要があるためです。DebugCRTをインストールする唯一の方法は、Visual Studio 2008全体をインストールすることです。

10
C配列の初期化「int arr [] = {e1、e2、e3、…}」の動作をstd :: arrayでエミュレートする方法は?
(注:この質問は、要素の数を指定する必要はなく、ネストされた型を直接初期化できるようにする必要があります。) この質問では、のようなC配列の残りの使用について説明しint arr[20];ます で彼の答え、@James観世ショーC配列の最後の砦の一つ、それはユニークな初期特性です: int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 }; 要素の数を指定する必要はありません。ここで、C ++ 11関数std::beginとstd::endfrom <iterator>(または独自のバリアント)を使用して反復処理します。サイズについて考える必要はありません。 今、同じことを達成する(おそらくTMP)方法はありますstd::arrayか?見栄えを良くするために許可されたマクロの使用。:) ??? std_array = { "here", "be", "elements" }; 編集:さまざまな回答からコンパイルされた中間バージョンは、次のようになります。 #include <array> #include <utility> template<class T, class... Tail, class Elem = typename std::decay<T>::type> …

7
64ビットWindowsのlongのビットサイズは何ですか?
少し前まで、誰かがlong64ビットマシンでは64ビットではないと言ってきましたint。私は常にを使用する必要があります。これは私には意味がありませんでした。long64ビットCPU向けにコンパイルすると、確かに64ビットであるというドキュメント(Appleの公式サイトにあるものなど)を見てきました。私はそれが64ビットWindowsで何であったかを調べて見つけました Windowsの場合:longとは、int長さが32ビットのままで、そして特殊な新しいデータ型は、64ビット整数のために定義されています。 (http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2から) 何を使うべきですか?Windowsではない場合uw、sw((un)signed width)のように定義する必要がありますかlong?それ以外の場合は、ターゲットCPUのビットサイズをチェックしますか?
137 c++  c  windows  64-bit  porting 

8
VC2010 Expressでインクルードファイル「afxres.h」を開けません
VS express 2010を使用して古いプロジェクトをコンパイルしようとしていますが、次のエラーが発生します。 致命的なエラーRC1015:インクルードファイル 'afxres.h'を開けません。このコードから ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" 私はすでにWindows SDKをインストールしていますが、成功していません。 ありがとう!

6
オーバーロードされた関数へのポインターを指定するにはどうすればよいですか?
オーバーロードされた関数をstd::for_each()アルゴリズムに渡したいのですが。例えば、 class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); } }; コンパイラーf()はイテレーター・タイプで解決することを期待します。どうやら、それ(GCC 4.1.2)はそれをしません。それで、どのようにしてf()私が欲しいものを指定できますか?
137 c++  stl 

5
C ++二重アドレス演算子?(&&)
私はSTLソースコードを読んでいて、&&アドレス演算子が何をすることになっているのか分かりません。これはからのコード例ですstl_vector.h: vector& operator=(vector&& __x) // <-- Note double ampersands here { // NB: DR 675. this->clear(); this->swap(__x); return *this; } 「Address of Address」は意味がありますか?なぜ1つではなく2つのアドレス演算子があるのですか?

15
C ++でのコンパイル時文字列の便利な宣言
C ++でのコンパイル時に文字列を作成および操作できることには、いくつかの便利なアプリケーションがあります。C ++でコンパイル時の文字列を作成することは可能ですが、文字列を可変長文字列として宣言する必要があるため、プロセスは非常に面倒です。 using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; 文字列連結、部分文字列抽出などの操作は、文字シーケンスの操作として簡単に実装できます。コンパイル時の文字列をより便利に宣言することは可能ですか?そうでない場合、コンパイル時の文字列の便利な宣言を可能にする作業の提案はありますか? 既存のアプローチが失敗する理由 理想的には、コンパイル時の文字列を次のように宣言できるようにしたいと思います。 // Approach 1 using str1 = sequence<"Hello, world!">; または、ユーザー定義のリテラルを使用して、 // Approach 2 constexpr auto str2 = "Hello, world!"_s; どこdecltype(str2)だろうconstexprコンストラクタを。アプローチ1の厄介なバージョンは、次のことができるという事実を利用して実装することが可能です。 template <unsigned Size, const char Array[Size]> struct foo; …



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