暇なときにNESエミュレータを趣味で開発しています。私がC++を使用しているのは、私が主に使用している言語であり、ほとんどが知っていて、ほとんどが好きだからです。
しかし、プロジェクトに少し進んだところで、C++のほとんどの特定の機能を使用していないことがわかり、プレーンCでも同じ結果を得ることができたはずです。テンプレート、演算子のオーバーロード、ポリモーフィズム、継承は使用しません。それで、あなたは何を言いますか? C++のままにするか、Cで書き直す必要がありますか?
パフォーマンスを向上させるためにこれを行うことはありませんが、副作用として発生する可能性がありますが、アイデアはC++が必要ないのになぜ使用する必要があるのですか?
私が使用しているC++の唯一の機能は、データとメソッドをカプセル化するクラスですが、それは構造体と関数でも実行でき、newとdeleteを使用していますが、mallocとfreeも使用できます。コールバックにのみ継承を使用します。これは、関数へのポインターで実現できます。
趣味のプロジェクトなので、締め切りはないので、書き直しを必要とするオーバーヘッドの時間や作業は問題ではなく、楽しいかもしれません。それで、問題はCかC++ですか?
現在は使用していませんが、次回メモリリークや二重削除が発生した場合は、std::vector<T>
、std::unique_ptr<T, Del>
、std::shared_ptr<T>
に戻ってきてください。これらの問題を簡単に解決できます。それがC++でCを使用するすべての人に起こります。最終的には、賢いものはバグがポップアップするのを待たずに先に進みます。
new
およびdelete
を直接使用するコードは、実際にはC++に属していません。「クラス付きC」と呼ばれるそのようなハーフハウスに属しています。それは1985年頃の言語でした。2011年頃のC++と特に似ていません。おそらく、C++を学んだことはありませんが、C++はあまりよく教えられていませんでした。 wouldこれらの機能の使用を見つけます。
具体的には、上でリストしたように、C++の汎用データ構造とリソース管理クラスは、Cが提供するものよりも根本的に非常に優れています。動的に割り当てられた配列が必要な場合は、std::vector<T>
を使用します。これはかなり一般的な使用例です。それらを使用していない場合、コードは不必要にエラーの大きなリスクにさらされます-特にリソース管理関連。 C++はguarantee安全であり、Cが決して触れることができない方法でコードを再利用できます。
しかし、あなたも期待しすぎているのではないかと思います。ライブラリコンシューマーでは、テンプレートとオペレーターオーバーロードの記述は一般的ではありません。コードでstd::vector<T>
を使用している場合、これを実現するためにテンプレートをwriteテンプレートにする必要はありません。コードでstd::string
を使用している場合、演算子をオーバーロードするように強制される人はいません。これらのことはwritestd::vector<T>
とstd::string
-に対して行うだけで済みますが、それらを完全に利用することができます。
ポリモーフィズム/継承にも特定のユースケースしかありません。コードでテンプレートを作成したり、仮想関数を使用したりする必要がない場合、その必要はありません。独自のテンプレートを作成する必要のないプログラムまたはプログラムのセグメントがあります。
また、C++ではなくCでのパフォーマンスの向上はありません。
C++固有の機能を使用しない場合でも、C++のより厳密な型システムにより、C++コンパイラーはCのものよりも多くの問題をキャッチします。
別の方向から見てみます。 gain Cでコードを書き直すことによって何かしますか?純粋な趣味のプロジェクトであっても、そのような書き換えにはコストがかかります。それ以外に機会費用と呼ばれるものがあるとすれば、それはつまり、そうでなければ、その時間に他のことができたはずです。 あなたの時間を無駄に Cでそれを書き換えます。
結論:C++へのアクセスが本当に制限されている(または存在しない)環境でコードが実際に使用される可能性が高いと思わない限り、最高の状態で時間を浪費することは無意味です。少なくとも私の経験では、通常はそれをはるかに超えています-C++で記述したコードを振り返ると、hadがCに変換されることを思い出すと、些細なことのように思われるいくつかのケースでは、私はC++に固有の機能を最初に実現したよりもはるかに多く使用していました。まったく役立つことを期待するには、C89/90をターゲットにする必要があります。その場合、実際の場所ではなく、ブロックの先頭ですべての変数を定義する必要があるなどのことをすぐに思い出すことができます。中古。
要するに、Cでの書き換えが実際の利点を提供することが確実である場合を除いて、やるべきことはほぼ間違いなく多くあります。
言語固有のスキル(C対C++)を改善するためにプロジェクトに取り組んでいるのか、その他のプログラミングスキル(設計、問題解決など)を改善するために取り組んでいるのかわからないため、質問に答えるのは簡単ではありません。
"私が使用しているC++の唯一の機能は、データとメソッドをカプセル化するクラスですが、構造体と関数でも同様に実行できます。"これは正しくありません。 Cのstructs
はカプセル化をサポートしておらず、関数(メソッド)を含めることはできません。少なくとも、関数へのポインターのような手法を使用しない限りはできません。また、Cの関数はオーバーロードできないため、脆弱です。
"newとdeleteを使用していますが、mallocとfreeを使用することもできます。また、コールバックだけに継承を使用しています。これは、関数へのポインターで実現できます。" deadmgが述べたように、 C++でnew
およびdelete
を直接使用することはお勧めしません。また、OOPでのIMHO(およびGoF)の継承は、ポリモーフィズムが必要な場合にのみ、コンポジションよりも優先される必要があります。Cでポリモーフィズム(遅延バインディング)を実現することは簡単ではないと思います関数へのポインタを使用します。
それ以外は、C++はCよりも「優れている」とは思いません。これは好みの問題であり、解決しようとしている問題に常に依存しているためです(OOP = NESエミュレータを開発するための機能は良い考えです)。
より一般的な答えとして:
よりユニークな機能の一部を使用しているという理由だけでC++に切り替えないでください。ある日、これらの機能が必要になる可能性があります。Cを使用しているため、頭が痛くなるだけです。
趣味の開発では、プレーンなCに戻すことを検討します。CおよびCのような言語は、小さな趣味の開発モジュールでサポートされる可能性が高くなります。
ここでの答えの多くは、専門的なソフトウェアタイプからのものである可能性があります。趣味として、あなたは継続的またはフルタイムでコーディングすることはありません。したがって、プロジェクトを1年間表にして、コーディングに錆びてきた後に戻ってコードを読み取ろうとする場合、どの言語を覚えているか、その中の癖を忘れやすいかを検討してください。豊富な機能セットを備えたC++は、コーディングスタイルによっては、再取得に多少の時間がかかる場合があります。
私はとても初心者なので、ここに私の2ビットがあります。
私はWibit.netでいくつかの素晴らしい基本的なビデオチュートリアルでCとC++を学んでいます。おそらく、それらは "状況"(広告ではありません)の概要を理解するのに非常に役立ちます。
Cに変更することをお勧めします。趣味であるので、これは楽しみであり、問題ではありません。
もっとアドバイスします。両方の言語で実行してください。見つけて使用する方法とソリューションを比較します。あなたが期待しているほど「簡単」ではないでしょう...しかし、あなたはたくさん学ぶでしょう!