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

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

11
割り当てられたメモリでfree()を使用しないことは問題ありませんか?
私はコンピュータ工学を勉強していて、いくつかの電子工学コースを持っています。私はそれを使用して回避することができる(これらのコースの)私の教授の2から、聞いたfree()(後に機能をmalloc()、calloc()おそらく割り当てられたメモリ空間は、他のメモリを割り当てるために再び使用されることはありませんので、など)。つまり、たとえば、4バイトを割り当ててから解放すると、4バイトのスペースができて、再び割り当てられない可能性があります。つまり、穴ができます。 私はそれがおかしいと思います:あなたはそれを解放せずにヒープにメモリを割り当てるおもちゃではないプログラムを持つことはできません。しかし、私には、それぞれにmalloc()がなければならないほど重要である理由を正確に説明する知識がありませんfree()。 だから:使用せmalloc()ずに使用することが適切であるかもしれない状況はありfree()ますか?そうでない場合は、どうすればこれを教授に説明できますか?

11
符号なしバイトの飽和減算/加算
私は2つの符号なしバイトを持っている想像bしてx。bsubasb - xとbaddasを計算する必要がありb + xます。ただし、これらの操作中にアンダーフロー/オーバーフローが発生することは望ましくありません。例(擬似コード): b = 3; x = 5; bsub = b - x; // bsub must be 0, not 254 そして b = 250; x = 10; badd = b + x; // badd must be 255, not 4 これを行うための明白な方法には、分岐が含まれます。 bsub = b - min(b, x); badd …

4
デストラクタの奇妙な列挙型
現在、のソースコードを読んでいますがProtocol Buffer、ここでenum定義されている奇妙なコードが1つ見つかりました。 ~scoped_ptr() { enum { type_must_be_complete = sizeof(C) }; delete ptr_; } void reset(C* p = NULL) { if (p != ptr_) { enum { type_must_be_complete = sizeof(C) }; delete ptr_; ptr_ = p; } } なぜenum { type_must_be_complete = sizeof(C) };ここで定義されているのですか?それは何のために使われますか?
83 c++  enums 

5
「プラグマ」という言葉はどこから来たのですか?
だから私はプラグマが何であるか、そしてそれが何のために使われるかを知っています、しかし単語自体の意味は何ですか?私はコードで何度もそれを使用しましたが、その単語が実際に何を意味するのか、または何を表すのかを本当に知りませんでした。
83 c++  c  terminology  pragma 

9
C ++からCへの移行
C ++でのコーディングを数年行った後、私は最近、組み込み分野でCでのコーディングの仕事を提供されました。 埋め込みフィールドでC ++を却下することが正しいか間違っているかという問題はさておき、C ++にはいくつかの機能/イディオムがあります。ほんの数例を挙げると: 一般的なタイプセーフなデータ構造(テンプレートを使用)。 RAII。特に、複数のリターンポイントを持つ関数では、たとえば、各リターンポイントでミューテックスを解放することを覚えておく必要はありません。 一般的なデストラクタ。つまり、MyClassに対してd'torを1回作成すると、MyClassインスタンスがMyOtherClassのメンバーである場合、MyOtherClassはMyClassインスタンスを明示的に非初期化する必要はありません。そのd'torは自動的に呼び出されます。 名前空間。 C ++からCに移行した経験は何ですか? お気に入りのC ++機能/イディオムの代わりにどのCを見つけましたか?C ++に必要なC機能を見つけましたか?
83 c++  c 

1
boost :: functionとboost :: bindのしくみ
コード全体にマジックボックスが散在しているのは嫌いです... function <>のパラメータが完全に異なるパラメータが渡された場合でも、基本的にすべての関数を関数オブジェクトにマップできるようにするには、これら2つのクラスがどのように機能するのでしょうか。 boost::bind さまざまな呼び出し規約でも機能します(つまり、メンバーメソッドは__thiscallVCの下にありますが、「通常の」関数は通常、__cdeclまたは__stdcallCとの互換性が必要な関数用です。

9
x << 1またはx << 10のどちらが速いですか?
私は何も最適化したくありません、私は誓います、私は好奇心からこの質問をしたいだけです。ほとんどのハードウェアには、単一のコマンドであるビットシフトのアセンブリコマンド(たとえばshl、shr)があることを私は知っています。ただし、シフトするビット数は重要ですか(ナノ秒単位、またはCPUタクト単位)。言い換えれば、次のいずれかがどのCPUでも高速ですか? x &lt;&lt; 1; そして x &lt;&lt; 10; そして、この質問で私を憎まないでください。:)
83 c++  c  performance  cpu  low-level 

4
std :: unique_ptrを渡す方法は?
私はC ++ 11を使用する最初の試みをしていunique_ptrます。1つのクラスが所有しているが、頻繁に渡される私のプロジェクト内のポリモーフィックなrawポインターを置き換えています。 以前は次のような機能がありました。 bool func(BaseClass* ptr, int other_arg) { bool val; // plain ordinary function that does something... return val; } しかし、私はすぐに私が切り替えることができないことに気づきました: bool func(std::unique_ptr&lt;BaseClass&gt; ptr, int other_arg); 呼び出し元は関数へのポインターの所有権を処理する必要があるため、私はしたくありません。だから、私の問題に対する最善の解決策は何ですか? 私は次のように、参照としてポインタを渡すことを考えました: bool func(const std::unique_ptr&lt;BaseClass&gt;&amp; ptr, int other_arg); しかし、そうすることには非常に不快感を覚えます。第一に、すでに入力さ_ptrれているものを参照として渡すのは本能的ではないように思われるため、参照の参照となるものです。第二に、関数のシグネチャがさらに大きくなるためです。第三に、生成されたコードでは、変数に到達するために2つの連続したポインターの間接化が必要になるためです。
83 c++  c++11  unique-ptr 

4
C ++でオブジェクトをどのようにシリアル化しますか?
ソケット接続を介してシリアル化および送信する必要があるオブジェクトの小さな階層があります。オブジェクトをシリアル化してから、タイプに基づいて逆シリアル化する必要があります。これをC ++で行う簡単な方法はありますか(Javaの場合と同様)? C ++シリアル化のオンラインコードサンプルまたはチュートリアルはありますか? 編集:明確にするために、私はオブジェクトをバイトの配列に変換してからオブジェクトに戻す方法を探しています。ソケット送信も対応できます。

6
ifステートメントとif-elseステートメントのどちらが速いですか?[閉まっている]
クローズ。この質問はもっと焦点を合わせる必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てるようにします。 3年前に閉鎖されました。 この質問を改善する 先日、この2つのスニペットについて友人と議論しました。どちらが速いのか、そしてその理由は? value = 5; if (condition) { value = 6; } そして: if (condition) { value = 6; } else { value = 5; } value行列の場合はどうなりますか? 注:私はそれvalue = condition ? 6 : 5;が存在することを知っており、より高速になることを期待していますが、それはオプションではありませんでした。 編集(質問は現在保留中のため、スタッフから要求されました): 最適化されたバージョンと最適化されていないバージョンの両方でメインストリームコンパイラ(g ++、clang ++、vc、mingwなど)によって生成されたx86アセンブリまたはMIPSアセンブリのいずれかを検討して回答してください。 アセンブリが異なる場合は、バージョンが高速である理由と時期を説明してください(たとえば、「分岐がないため、分岐に次の問題が発生するため、より良い」)

3
CUDAがメモリを固定するのはなぜそんなに速いのですか?
CUDAデータ転送にピン留めされたメモリを使用すると、データ転送が大幅に高速化されます。Linuxでは、これを実現するための基盤となるシステムコールはmlockです。mlockのmanページから、ページをロックするとスワップアウトされないことが示されています。 mlock()は、addrから始まり、lenバイトまで続くアドレス範囲のページをロックします。指定されたアドレス範囲の一部を含むすべてのページは、呼び出しが正常に戻ったときにRAMに常駐することが保証されています。 私のテストでは、システムに数ギガの空きメモリがあったため、メモリページがスワップアウトされるリスクはありませんでしたが、それでもスピードアップが見られました。誰かがここで実際に何が起こっているのか説明できますか?、洞察や情報は大歓迎です。
83 c++  c  linux  cuda 

4
ADLが関数テンプレートを見つけられないのはなぜですか?
C ++仕様のどの部分が、引数に依存するルックアップが、関連付けられた名前空間のセットで関数テンプレートを見つけることを制限していますか?言い換えると、main以下の最後の呼び出しがコンパイルに失敗するのはなぜですか? namespace ns { struct foo {}; template&lt;int i&gt; void frob(foo const&amp;) {} void non_template(foo const&amp;) {} } int main() { ns::foo f; non_template(f); // This is fine. frob&lt;0&gt;(f); // This is not. }

8
カスタムコンパレータを使用してC ++でpriority_queueを宣言する
コンパレータ関数(ノードクラスの外部)としてpriority_queue of nodesを使用して、を宣言しようとしbool Compare(Node a, Node b)ています。 私が現在持っているものは: priority_queue&lt;Node, vector&lt;Node&gt;, Compare&gt; openSet; どういうわけか、私は得ています Error: "Compare" is not a type name 宣言をに変更する priority_queue &lt;Node, vector&lt;Node&gt;, bool Compare&gt; 私にくれます Error: expected a '&gt;' 私も試しました: priority_queue&lt;Node, vector&lt;Node&gt;, Compare()&gt; openSet; priority_queue&lt;Node, vector&lt;Node&gt;, bool Compare()&gt; openSet; priority_queue&lt;Node, vector&lt;Node&gt;, Compare&lt;Node, Node&gt;&gt; openSet; どうすれば正しく宣言できますpriority_queueか?

7
std :: multisetには、要素が見つかった場合に1つのサンプル(一意または複製)のみを消去する関数またはアルゴリズムがあります
おそらくこれは重複していますが、検索するものは何も見つかりませんでした。見つかった値を持つすべての要素でerase(value)が呼び出されるstd::multisetと、削除されます。私が考えることができる唯一の解決策は次のとおりです。 std::multiset&lt;int&gt;::iterator hit(mySet.find(5)); if (hit!= mySet.end()) mySet.erase(hit); これは大丈夫ですが、もっと良いかもしれないと思いました。何か案は ?
83 c++  stl  multiset 


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