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

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

4
インポートライブラリはどのように機能しますか?詳細?
これはオタクにとってはかなり基本的なことのように思えるかもしれません。しかし、私はそれを明確にしたい。 Win32 DLLを使用する場合、通常はLoadLibrary()やGetProcAdderss()などのAPIを呼び出すだけです。しかし最近、DirectX9で開発しているので、d3d9.lib、d3dx9.libなどのファイルを追加する必要があります。 LIBは静的リンク用で、DLLは動的リンク用であると十分に聞いています。 したがって、私の現在の理解では、LIBにはメソッドの実装が含まれており、最終的なEXEファイルの一部としてリンク時に静的にリンクされます。DLLは実行時に動的にロードされ、最終的なEXEファイルの一部ではありません。 しかし、時には、いくつかのLIBファイルそこにいると来そう、DLLファイル: これらのLIBファイルは何のためのものですか? 彼らはどのように彼らが意図されていることを達成しますか? これらのLIBファイルの内部を検査できるツールはありますか? アップデート1 ウィキペディアをチェックした後、これらのLIBファイルはインポートライブラリと呼ばれていることを思い出します。しかし、メインアプリケーションと動的にロードされるDLLでどのように機能するのか疑問に思っています。 アップデート2 RBerteigが言ったように、DLLで生まれたLIBファイルにはいくつかのスタブコードがあります。したがって、呼び出しシーケンスは次のようになります。 私のメインアプリケーション-> LIBのスタブ->実際のターゲットDLL では、これらのLIBにはどのような情報を含める必要がありますか?私は次のことを考えることができます: LIBファイルには、対応するDLLのフルパスが含まれている必要があります。したがって、DLLはランタイムによってロードされる可能性があります。 各DLLエクスポートメソッドのエントリポイントの相対アドレス(またはファイルオフセット?)は、スタブでエンコードする必要があります。したがって、正しいジャンプ/メソッド呼び出しを行うことができます。 私はこれで正しいですか?他に何かありますか? ところで:インポートライブラリを検査できるツールはありますか?私がそれを見ることができれば、これ以上の疑いはありません。
90 c++  c  windows  visual-c++ 

8
ヘッダーとソースにC ++名前空間を作成する(cpp)
ヘッダーとcppファイルの両方の内容を名前空間でラップすることと、ヘッダーの内容だけをラップしてからcppファイルで名前空間を使用することとの間に違いはありますか? 違いとは、問題や私が知っておく必要のあることを引き起こす可能性のある、あらゆる種類のパフォーマンスの低下やわずかに異なるセマンティクスを意味します。 例: // header namespace X { class Foo { public: void TheFunc(); }; } // cpp namespace X { void Foo::TheFunc() { return; } } VS // header namespace X { class Foo { public: void TheFunc(); }; } // cpp using namespace X; { void Foo::TheFunc() { …
90 c++  namespaces 


7
パラメータの前のconstと関数名の後のconstc ++
このようなものの違いは何ですか friend Circle copy(const Circle &); そしてこのようなもの friend Circle copy(Circle&) const; 関数を使用して、この関数が呼び出されたオブジェクトを変更しようとしないことをコンパイラーに通知した後、constを知っていますが、他のオブジェクトはどうですか?

2
メンバーが1つだけの組合を使用する目的は何ですか?
seastarのソースコードを読んでいたときに、tx_sideメンバーが1つだけのと呼ばれる共用体構造があることに気付きました。これは特定の問題に対処するためのハックですか? tx_side参考までに、以下の構造を貼り付けます。 union tx_side { tx_side() {} ~tx_side() {} void init() { new (&a) aa; } struct aa { std::deque<work_item*> pending_fifo; } a; } _tx;
89 c++  c++14  unions 

6
グローバルラムダを使用しない理由はありますか?
それ自体の内部にある非キャプチャラムダを使用する関数がありました。例: void foo() { auto bar = [](int a, int b){ return a + b; } // code using bar(x,y) a bunch of times } ラムダによって実装された機能が別の場所で必要になったので、ラムダをfoo()グローバル/名前空間スコープに持ち上げます。ラムダのままにするか、コピーと貼り付けのオプションにするか、適切な関数に変更できます。 auto bar = [](int a, int b){ return a + b; } // option 1 int bar(int a, int b){ return a + b; …
89 c++  lambda 

5
ラムダのサイズが1バイトなのはなぜですか?
C ++でいくつかのラムダのメモリを使用していますが、そのサイズに少し戸惑っています。 これが私のテストコードです: #include <iostream> #include <string> int main() { auto f = [](){ return 17; }; std::cout << f() << std::endl; std::cout << &f << std::endl; std::cout << sizeof(f) << std::endl; } ここで実行できます:http : //fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598 出力は次のとおりです。 17 0x7d90ba8f626f 1 これは、ラムダのサイズが1であることを示唆しています。 これはどのようにして可能ですか? ラムダは、少なくとも、その実装へのポインタであってはなりませんか?
89 c++  c++11  lambda  c++14  sizeof 

3
C ++で条件付きtypedefを作成する方法
私はこのようなことをやろうとしています: #include <iostream> #include <random> typedef int Integer; #if sizeof(Integer) <= 4 typedef std::mt19937 Engine; #else typedef std::mt19937_64 Engine; #endif int main() { std::cout << sizeof(Integer) << std::endl; return 0; } しかし、私はこのエラーを受け取ります: error: missing binary operator before token "(" 条件付きtypedefを正しく作成するにはどうすればよいですか?
89 c++  c++11 


5
「std :;」とは C ++で行う?
私は最近いくつかのコードを変更していて、関数内の1行に既存のバグを見つけました: std:;string x = y; このコードは引き続きコンパイルされ、期待どおりに動作しています。 このファイルはusing namespace std;であるため、文字列定義は機能しますstd::。そもそもこれは不要でした。 問題は、なぜstd:;コンパイルしているのか、そしてもしあれば、何をしているのか、です。
89 c++  std  colon 

2
文字「A」が0x41と比較されるのはなぜですか?
私はいくつかのC ++コードを見ていて、次の構造を見つけました: if('A' == 0x41) { // ... } else if('A' == 0xc1) { // ... } else { // ... } 次のようなVisual Studioの警告が表示されます。 警告C4127条件式は定数です。 Visual Studioは明らかに正しいです-確かに 'A'は0x41と定義されています。3つのブランチのうちの2つがデッドコードであるとすると、なぜこのコードを作成しているのですか?
89 c++  string 

2
GNU GCC(g ++):なぜ複数のdtorを生成するのですか?
開発環境:GNU GCC(g ++)4.1.2 ユニットテストで「コードカバレッジ-特に関数カバレッジ」を増やす方法を調査しようとしているときに、クラスdtorの一部が複数回生成されているように見えることがわかりました。何人かあなたはその理由について何か考えていますか? 次のコードを使用して、上記のことを試して観察しました。 「test.h」 class BaseClass { public: ~BaseClass(); void someMethod(); }; class DerivedClass : public BaseClass { public: virtual ~DerivedClass(); virtual void someMethod(); }; 「test.cpp」 #include <iostream> #include "test.h" BaseClass::~BaseClass() { std::cout << "BaseClass dtor invoked" << std::endl; } void BaseClass::someMethod() { std::cout << "Base class method" …
89 c++  g++  destructor 

4
デフォルトのmove-assignment / move-constructorがないのはなぜですか?
私は単純なプログラマーです。私のクラスメンバーの変数は、ほとんどの場合、PODタイプとSTLコンテナーで構成されています。このため、代入演算子やコピーコンストラクタを記述する必要はほとんどありません。これらはデフォルトで実装されているからです。 これに加えて、std::move移動できないオブジェクトで使用する場合は、代入演算子を使用するため、std::move完全に安全です。 私は単純なプログラマーなので、コンパイラーが " this->member1_ = std::move(other.member1_);..." として実装するだけなので、作成するすべてのクラスに移動コンストラクター/割り当て演算子を追加せずに、移動機能を利用したいと思います。 しかし、そうではありません(少なくともVisual 2010ではそうではありません)。これには特別な理由がありますか? さらに重要なことには; これを回避する方法はありますか? 更新: GManNickGの答えを見ると、GManNickGはこのための優れたマクロを提供しています。また、知らない場合は、移動セマンティクスを実装すれば、メンバーのスワップ関数を削除できます。

4
memmpyよりmemmoveが速いのはなぜですか?
memmove(3)で時間の50%を費やすアプリケーションのパフォーマンスホットスポットを調査しています。アプリケーションは、何百万もの4バイト整数をソートされた配列に挿入し、memmoveを使用してデータを「右に」シフトし、挿入された値のためのスペースを作ります。 メモリのコピーは非常に高速であると私は予想しており、memoveに多くの時間が費やされていることに驚きました。しかし、それからmemmoveは、メモリの大きなページをコピーするのではなく、タイトなループで実装する必要がある重複領域を移動するため、遅いと考えました。memcpyとmemmoveの間にパフォーマンスの違いがあるかどうかを確認するために、小さなマイクロベンチマークを書きました。memcpyが勝つことを期待しています。 私は2つのマシン(コアi5、コアi7)でベンチマークを実行し、memmpyがmemcpyよりも実際に高速であることを確認しました。古いコアi7では、2倍近くも高速です!今、私は説明を探しています。 これが私のベンチマークです。memcpyで100 mbをコピーし、memmoveで約100 mb移動します。ソースと宛先が重複しています。発信元と宛先のさまざまな「距離」が試されます。各テストは10回実行され、平均時間が印刷されます。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c Core i5(Linux 3.5.0-54-generic#81〜precise1-Ubuntu SMP x86_64 GNU / Linux、gccは4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)での結果です。角かっこ内の数値はソースと宛先の間の距離(ギャップサイズ): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 MemmoveはSSEに最適化されたアセンブラーコードとして実装され、後ろから前へコピーします。ハードウェアプリフェッチを使用してデータをキャッシュにロードし、128バイトをXMMレジスタにコピーして、宛先に格納します。 (memcpy-ssse3-back.S、1650行目以降) L(gobble_ll_loop): prefetchnta -0x1c0(%rsi) prefetchnta -0x280(%rsi) prefetchnta -0x1c0(%rdi) …
89 c++  c  performance  memory 

3
これはC ++ 11 forループの既知の落とし穴ですか?
いくつかのメンバー関数で3つのdoubleを保持するための構造体があるとします。 struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } // ... }; これは簡単にするために少し工夫されていますが、同様のコードがそこにあることに同意するはずです。これらのメソッドを使用すると、便利なチェーンを作成できます。次に例を示します。 Vector v …

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