Cプログラマーを緊張させるC ++に関すること
内部では多くの魔法が発生しています。コンストラクタ、デストラクタ、仮想メソッド、テンプレートなどにより、C ++コードは同等のCコードよりもはるかに簡単かつ高速に記述できますが、理解と推論が難しくなります(C ++とその関連する規則をどれだけ知っているかによって異なります)。クラス(およびそれが依存するクラス)のコンストラクターがどのように定義されているかに応じてFoo newFoo;
、多くのコードを呼び出すような単純なものFoo
。postfix にはコストのかかるコピー操作が含まれることが多いため、これはまた、コンテナを反復処理するときでは++it
なく、書くという規則である理由でもあります。 it++
++
何をしているのかにもよりますが、特に単純なタスクの場合、わずかなオーバーヘッドが発生する可能性があります。次の2つのプログラムを使用します。1つ目はC、2つ目はC ++です。
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
同一の動作で、ソースの点で大きな違いはありませんが、gcc 4.1.2で作業しているSLES 10ボックスでは、前者は〜9kbのサイズの実行可能ファイルを生成しますが、2番目は12.5kbを引き継ぎます(最適化なし) )、ほぼ28%大きくなります。C ++ string
型はC文字列ライブラリよりもIMOでの作業がはるかに簡単であり、C ++ストリームはCストリームよりもはるかに柔軟でカスタマイズ可能ですが、このような本当に頭の痛いコードの場合、オーバーヘッドの価値はないかもしれません。
C ++は、Cと比較して非常に複雑なセマンティクスを持つ巨大な言語です。C ++に習熟するには、Cよりもはるかに長い時間がかかります。つまり、C ++を知っていると主張する多くの人々は、C ++を自分が思っているほど知らないのです。
C ++プログラマーを緊張させるCのこと
Cは想像力の広がりによって安全なプログラミング言語ではありません。アレイ上のチェックはとどまるところを(今死んを通してそれをも攻撃可能な行動の多くにつながるしないgets
、またはスルー機能scanf
付き%s
と%[
変換指定子)。C ++は少なくとも、現在定義されている範囲外にアクセスしようとすると、例外をスローするコンテナーを提供します。Cが提供するものはすべて(幸運なら)セグメンテーション違反です。
Cでのメモリ管理は、C ++が提供するツールと比較して、非常に労働集約的でエラーが発生しやすいです。独自のコンテナを構築している場合、すべてのmalloc
およびfree
呼び出しを照合し、割り当てが成功したことを確認し、エラーが発生した場合に部分的な割り当てを取り消すなどの責任があります。C++では、コンテナからアイテムを削除します。問題がある場合、例外がスローされます。
同様に、Cでのエラー処理は、C ++が提供するツール(つまり、例外)に比べて苦痛です。本当に楽しいのは、大量のメモリを割り当ててから、処理中に壁にぶつかったときです。バックアウトする必要があるため、適切な順序でメモリを解放する必要があります。C ++およびRAIIの原則を使用すると、これは(比較的)簡単に実行できます。
それで、いつ私は一方をもう一方の上に使うのですか?
何を書いていることは湿原シンプルであれば、その動作が入力と出力の観点できれいに説明することができ、それアプリケーション、取り除く/それでそれ/堆肥を読むと、パフォーマンスの問題、そしてC ++上でCを好みます。それ以外の場合は、C ++を優先します