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

静的に型付けされた自由形式のマルチパラダイムでコンパイルされた汎用プログラミング言語であるC ++に関する質問。

1
raw、weak_ptr、unique_ptr、shared_ptrなど…賢明な選択方法は?
C ++には多くのポインタがありますが、C ++プログラミング(具体的にはQt Frameworkを使用)で5年ほど前に正直に言うと、古い生のポインタのみを使用します。 SomeKindOfObject *someKindOfObject = new SomeKindOfObject(); 私は他にも多くの「スマート」ポインターがあることを知っています。 // shared pointer: shared_ptr<SomeKindofObject> Object; // unique pointer: unique_ptr<SomeKindofObject> Object; // weak pointer: weak_ptr<SomeKindofObject> Object; しかし、私はそれらをどうするか、生のポインタの比較で彼らが私に何を提供できるのかについて少しも考えていません。 たとえば、次のクラスヘッダーがあります。 #ifndef LIBRARY #define LIBRARY class LIBRARY { public: // Permanent list that will be updated from time to time where // each items …

7
コンストラクターが継承されないのはなぜですか?
コンストラクターが基本クラスから継承された場合、どのような問題が発生する可能性があるのか​​、私は混乱しています。Cpp Primer Plusによると、 コンストラクターは他のクラスメソッドとは異なり、新しいオブジェクトを作成しますが、他のメソッドは既存のオブジェクトによって呼び出されます。これが、コンストラクターが継承されない理由の1つです。継承とは、派生オブジェクトが基本クラスメソッドを使用できることを意味しますが、コンストラクターの場合、コンストラクターが作業を完了するまでオブジェクトは存在しません。 オブジェクトの構築が完了する前にコンストラクターが呼び出されることを理解しています。 子クラスが継承する場合、どうすれば問題につながる可能性があります(継承することで、子クラスが親クラスメソッドをオーバーライドできることを意味します。 オブジェクトを作成するときを除いて、コード内から明示的にコンストラクターを呼び出す必要はないことを理解しています(まだ気づいていません)。その場合でも、何らかのメカニズムを使用して、親コンストラクタを呼び出すことができます[cppでは、使用::または使用member initialiser list、javaでは使用super]。Javaでは、1行目で呼び出す強制があります。最初に親オブジェクトを作成してから、子オブジェクトの構築を続行することを理解しています。 それを無効にすることができます。しかし、私はこれが問題を引き起こす可能性がある状況を思い付くことができません。子が親コンストラクタを継承しない場合、何が問題になる可能性がありますか? これは、不要な関数を継承しないようにするためです。それとももっとありますか?
33 c++  inheritance 

9
あまりにも多くのアサートを書くことは可能ですか?
私は執筆の大ファンです assert開発中に発生する可能性のあるケースをキャッチする方法としてC ++コードでチェック。プログラムのロジックバグが原因で発生する可能性があります。これは一般的に良い習慣です。 しかし、私が書いたいくつかの関数(複雑なクラスの一部である)には5つ以上のアサートがあることに気づきました。それぞれが関数の事前条件と事後条件について考える必要があり、それらは本当にバグをキャッチするのに役立つので、それはまだ素晴らしいと思います。ただし、多数のチェックが必要な場合にロジックエラーをキャッチするためのより良いパラダイムがあるかどうかを尋ねるために、これをそこに置きたかっただけです。 Emacsのコメント:Emacsが私の選択のIDEであるため、アサートステートメントを少しグレー表示にして、提供できる混乱を軽減します。.emacsファイルに追加するものは次のとおりです。 ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))

4
C、C ++などのJITコンパイラ
CやC ++などのコンパイル言語用のジャストインタイムコンパイラはありますか?(頭に浮かぶ最初の名前はClangとLLVMです!しかし、私は彼らが現在それをサポートしているとは思いません。) 説明: このソフトウェアは、CやC ++などのコンパイルされたマシン言語でも、ランタイムプロファイリングフィードバックと、実行時のホットスポットの積極的に最適化された再コンパイルの恩恵を受けると思います。 プロファイルに基づく最適化も同様の仕事をしますが、異なる環境ではJITがより柔軟になります。PGOでは、リリースする前にバイナリを実行します。リリース後、実行時に収集された環境/入力フィードバックは使用されません。そのため、入力パターンが変更された場合、パフォーマンスの低下が発生します。しかし、JITはそのような状況でもうまく機能します。 ただし、JITコンパイルのパフォーマンス上の利点がそれ自体のオーバーヘッドを上回るかどうかについては議論の余地があると思います。

7
パフォーマンスのためにCで作成しますか?[閉まっている]
Cは通常C ++よりもパフォーマンスが優れているとよく耳にします。MSVCがCの最新の標準をサポートしていないように思えるまで、それ以外のことは何も考えていませんでしたが、最新のものはC99をサポートしています(私の知る限り)。 OpenGLでレンダリングするためのコードを含むライブラリを作成して、再利用できるようにすることを計画していました。グラフィックに関しては、パフォーマンスの向上を歓迎するため、ライブラリをCで作成することを計画していました。 しかし、それは本当に価値があるでしょうか?ライブラリを使用するコードはおそらくC ++で書かれているため、一般的にはC ++でコーディングすることを好みます。 ただし、パフォーマンスにわずかな違いさえ生じる場合は、Cを使用します。 また、このライブラリは、Windows / OS X / Linux全体で動作するようにするものであり、すべてをネイティブにコンパイルする可能性があります(Windows用のMSVC、OS X用のClangまたはGCC、およびLinux用のGCC)。 。またはおそらくすべてのインテルのコンパイラ)。 私は周りを見回し、いくつかのベンチマークなどを見つけましたが、私が見たものはすべて、MSVCとClangではなくGCCを扱っています。また、ベンチマークでは使用言語の標準については言及していません。誰もこれについて考えていますか? 編集:数年以上の経験を経て、この質問に対する私の見解を共有したかっただけです。C ++でこの質問をしていたプロジェクトを書くことになりました。私は、Cでリンクできるようにするために、できる限り少量のパフォーマンスを引き出したいと考えていたのと同じ頃に、Cで別のプロジェクトを開始しました。数ヶ月前、私は本当にマップと高度な文字列操作。私はC ++標準ライブラリのこの能力を知っていて、最終的に標準ライブラリのそれらの構造は、妥当な時間内にCで実装できるマップや文字列よりもパフォーマンスが高く安定しているという結論に達しました。Cでリンク可能であるという要件は、C ++コードへのCインターフェイスを記述することで簡単に満たされました。これは、不透明(OPAQUE)型で迅速に行われました。C ++でのライブラリの書き換えは、Cでの書き込みよりもはるかに高速であるようで、バグ、特にメモリリークが発生しにくい傾向がありました。プラットフォーム固有の実装を使用するよりもはるかに簡単な標準ライブラリスレッドライブラリを使用することもできました。最終的には、C ++でライブラリを作成することで、パフォーマンスコストをわずかに抑えながら大きなメリットを得ることができたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。ライブラリをC ++で記述すると、パフォーマンスコストはおそらくわずかですが、大きなメリットが得られたと思います。私はまだC ++バージョンのベンチマークを行っていませんが、私が書いたものよりも標準ライブラリのデータ構造を使用することで、ある程度のパフォーマンスを得た可能性さえあると信じています。

2
ブール値が1ビットのみを必要とするのにコンピューターの内部にバイトとして保存されるのはなぜですか
私は最近、コードを書くことを学び始めましたが、私の本でこの質問に出会いました。「1ビットしか必要としないのに、なぜブール値がコンピューターの内部にバイトとして保存されるのですか?」誰かがこの質問にもっと光を当てることができますか?

10
C ++でベクターを介してリストを使用する意味は何ですか?
C ++リストとベクターを含む3つの異なる実験を実行しました。 中間に多くの挿入が含まれていた場合でも、ベクトルを使用したものはより効率的であることが証明されました。 したがって、質問:どの場合、リストはベクトルよりも意味がありますか? ほとんどの場合、ベクトルがより効率的であると思われ、それらのメンバーがどれだけ似ているかを考えると、リストにはどの利点が残っていますか? N個の整数を生成し、コンテナに入れて、コンテナがソートされたままになるようにします。挿入は、要素を1つずつ読み取り、最初の大きい要素の直前に新しい要素を挿入することにより、単純に実行されました。 リストを使用すると、ベクトルと比較して寸法が大きくなると屋根を通過します。 コンテナの最後にN個の整数を挿入します。 リストとベクトルの場合、時間は同じ桁数増加しましたが、ベクトルの場合は3倍高速でした。 コンテナにN個の整数を挿入します。 タイマーを開始します。 リストにはlist.sortを使用し、ベクターにはstd :: sortを使用してコンテナをソートします。タイマーを停止します。 繰り返しますが、時間は同じ桁で増加しますが、ベクトルでは平均で5倍速くなります。 引き続きテストを実行し、リストの方が良い例がいくつか見つかるかもしれません。 しかし、このメッセージを読んでいる皆さんの共同経験は、より生産的な答えを提供するかもしれません。 リストの使用がより便利だったり、パフォーマンスが向上したりする状況に出くわしたことがありますか?

11
typedefsおよび#defines
私たちは皆、間違いなくtypedefsと#definesを使用しました。今日、彼らと仕事をしている間、私は物事について熟考し始めました。 int別の名前のデータ型を使用するには、以下の2つの状況を考慮してください。 typedef int MYINTEGER そして #define MYINTEGER int 上記の状況のように、多くの状況で、#defineを使用して非常にうまく処理でき、typedefを使用して同じことを実行できますが、同じことを行う方法はまったく異なる場合があります。#defineは、typedefではできないMACROアクションも実行できます。 それらを使用する基本的な理由は異なりますが、動作はどの程度異なりますか?両方を使用できる場合に、一方が他方よりも優先される場合 また、一方の状況では、他方よりも高速であることが保証されていますか?(たとえば、#defineはプリプロセッサディレクティブであるため、すべてがコンパイルまたは実行時よりも早く実行されます)。

8
Qtフレームワークを通じてC ++を学習していますC ++を実際に学習しています[非公開]
私が抱えている問題は、私が読んだC ++の本のほとんどは、構文や言語の基本(forループwhile、配列、リスト、ポインターなど)にほぼ永遠に費やしていることです。 しかし、彼らは学習に使用するのに十分シンプルでありながら、言語の哲学と力を理解するのに十分な実用的なものを決して構築しないようです。 それから素晴らしいライブラリーであるQTを見つけました! しかし、彼らが持っているデモを通して、私は今、逆のジレンマに陥っているようです。金持ちの息子が父親の助成を受けたスポーツカーを走り回っているような気がします。私は素晴らしいソフトウェアを構築できたが、内部で何が起こっているのか見当もつかないように。 私のジレンマの例として、単純なWebブラウザーを構築するタスクを取り上げます。純粋なC ++では、どこから始めればよいのかさえわかりませんが、Qtライブラリを使用すると、コードの数行以内で実行できます。 私はこれについて文句を言っていません。言語の基本構造とQtフレームワークが提供する高レベルのインターフェースとの間の知識の空白を埋める方法を疑問に思っていますか?

5
実装をリークすることなく、内部ベクトルの反復を許可します
人々のリストを表すクラスがあります。 class AddressBook { public: AddressBook(); private: std::vector<People> people; } クライアントが人々のベクトルを反復処理できるようにします。私が持っていた最初の考えは単純でした: std::vector<People> & getPeople { return people; } しかしながら、 実装の詳細をクライアントに漏らしたくありません。ベクトルが変更されたときに特定の不変式を維持したい場合があり、実装をリークするとこれらの不変式に対する制御が失われます。 内部をリークすることなく反復を許可する最良の方法は何ですか?
32 c++ 

8
変数に小さいデータ型を使用してメモリを節約するのは良い習慣ですか?
C ++言語を初めて学んだとき、int、floatなどに加えて、これらのデータ型のより小さいバージョンまたは大きいバージョンが言語内に存在することを知りました。たとえば、変数xを呼び出すことができます int x; or short int x; 主な違いは、short intは2バイトのメモリを使用し、intは4バイトを使用し、short intの値は小さいことですが、これを呼び出してさらに小さくすることもできます。 int x; short int x; unsigned short int x; さらに制限されています。 ここでの私の質問は、プログラム内で変数が取る値に応じて別々のデータ型を使用するのが良い方法かどうかです。これらのデータ型に従って変数を常に宣言することは良い考えですか?


3
エラー処理の考慮事項
問題: 長い間、私はexceptionsメカニズムが本当に何をすべきかを実際には解決しないと感じているため、メカニズムについて心配しています。 クレーム:このトピックについては長い議論があり、それらのほとんどはexceptionsエラーコードの比較と返送に苦労しています。これは間違いなくここのトピックではありません。 エラーを定義しようとすると、Bjarne Stroustrup&Herb SutterのCppCoreGuidelinesに同意します エラーは、関数が公示された目的を達成できないことを意味します クレーム:exceptionメカニズムは、エラーを処理するための言語セマンティックです。 クレーム:私には、タスクを達成しないための機能には「言い訳」がありません:機能が結果を保証できないように事前/事後条件を誤って定義したか、開発に時間を費やすために特定の例外的なケースが十分に重要ではないと考えられます解決策。IMOでは、通常のコードとエラーコードの処理の違いは(実装前に)非常に主観的なものだと考えています。 クレーム:例外を使用して、事前または事後条件が維持されていないことを示すことはexception、主にデバッグの目的で、メカニズムの別の目的です。私はexceptionsここのこの使用法をターゲットにしません。 多くの書籍、チュートリアル、およびその他のソースでは、エラー処理は非常に客観的な科学として示される傾向がexceptionsありますが、それは解決され、catchあらゆる状況から回復できる堅牢なソフトウェアが必要です。しかし、開発者としての数年間は、別のアプローチから問題を見るようになりました。 プログラマは、特定のケースがあまりにもまれに慎重に実装できないと思われる場合に例外をスローすることにより、タスクを単純化する傾向があります。この典型的なケースは次のとおりです。メモリ不足の問題、ディスクの空き容量の問題、破損したファイルの問題など。これで十分かもしれませんが、必ずしもアーキテクチャレベルから決定されるわけではありません。 プログラマは、ライブラリの例外に関するドキュメントを注意深く読んでいない傾向があり、通常、関数がスローするタイミングとタイミングを認識していません。さらに、たとえ知っていても、実際には管理していません。 プログラマーは、十分早くに例外をキャッチしない傾向があります。そして、それらをキャッチする場合、ほとんどの場合、ログに記録してさらにスローします。(最初のポイントを参照)。 これには2つの結果があります。 頻繁に発生するエラーは、開発の初期段階で検出され、デバッグされます(これは良いことです)。 まれな例外は管理されず、ユーザーのホームでシステムがクラッシュします(素敵なログメッセージが表示されます)。エラーが報告される場合もあれば、そうでない場合もあります。 それを考慮すると、IMOのエラーメカニズムの主な目的は次のとおりです。 特定のケースが管理されていないコードで可視化する。 この状況が発生した場合、問題のランタイムを関連コード(少なくとも呼び出し元)に伝えます。 回復メカニズムを提供します exceptionエラー処理メカニズムとしてのセマンティックの主な欠陥はIMOです。throwソースコードのどこにa があるかは簡単にわかりますが、宣言を見ることで特定の関数がスローできるかどうかはわかりません。これは、上で紹介したすべての問題をもたらします。 言語は、言語の他の側面(たとえば、強力なタイプの変数)の場合ほど厳密にエラーコードを適用およびチェックしません。 解決策を試す これを改善するために、非常に単純なエラー処理システムを開発しました。これは、通常のコードと同じレベルのエラー処理をエラー処理にしようと試みます。 アイデアは次のとおりです。 各(関連する)関数は、success非常に軽いオブジェクトへの参照を受け取り、場合によってはエラー状態に設定することがあります。オブジェクトは、テキスト付きのエラーが保存されるまで非常に軽いです。 提供されたオブジェクトに既にエラーが含まれている場合、関数はそのタスクをスキップすることが推奨されます。 エラーを無効にしないでください。 完全な設計では、明らかに各側面(約10ページ)を徹底的に検討し、OOPへの適用方法も検討します。 Successクラスの例: class Success { public: enum SuccessStatus { ok = 0, // All is fine error = 1, // …

8
Makeを直接使用することは時代遅れと見なされますか?[閉まっている]
ですから、メイクファイルを直接作成することや、2015年にそれを行うのは馬鹿げたことです。CMakeなどのツールを知っており、実際にCMakeを頻繁に使用しています。大切なのは、CMakeはMakefileを作成して、自分でそれを行うという退屈な作業をなくすことです。もちろん、それは他の多くの素晴らしい機能を追加します...しかし、最終的にはまだMakefileです。 だから私の質問は、Makeユーティリティ全体を指すmakeに関する「時代遅れの」話ですか、それとも自分のMakefileを手動で書くというアイデアですか?私はC / C ++開発にIDEをまったく使用しません(ちょうどemacs)ので、常にMakefileを作成しました。 Makeが古いと見なされる場合、C / C ++開発者は小さな個人プロジェクトを構築するために何を使用すべきですか?
31 c++  c  builds  make  cmake 

2
C ++ / CXおよびC ++ / CLIとは何ですか?また、C ++およびWinRTとどのように関係しますか?
Metroアプリを設計するためにC ++の学習という課題に取り組むことを検討していましたが、そのときにC ++ / CXに出会いました。 MetroアプリはC ++ 11でコーディングできますか?動作させるにはC ++ / CXが必要ですか?そして、C ++ / CXとは正確には何ですか?C ++のみを使用してMetroアプリを作成することは可能ですか、それともC ++ / CXが必要ですか?また、C ++ / CLIはこの図とどのように結びついていますか?
31 c++  windows-8  winrt 

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