CまたはC++はC/C++ではありません



C++はC/C++ではありません.現在、多くの会社のプログラマーはC/C++プログラマーです.問:C/C++はどんな言語ですか.答え:CにはC++があり、C++にはCがあります.たとえば、次のコードがあります.
int b[256]; 
 memset(b, 0, sizeof(b));
 for (int i = 0; i < 1000000; ++i)
 {
for (size_t j = 0; j < 256U; ++j) 
 { 
    b[j] = 10 * j; 
 }
  } 


 
一.まだ元の配列を使ってるの?なぜvectorがあったのか分からないが、多くの人がC++コードを書くのか、それとも元の配列を使うのか.(何らかの理由でvectorが使えない?)
vectorがもたらすメリットを見てみましょう.
1.定義すれば、上の1行目と2行目を初期化できるのは明らかにstd::vectorb(256,0)で置き換えられ、意味は簡単明瞭である.上のmemsetは簡単にmemset(b,0,256)と書いたのではないでしょうか.
2.vector変数にはsize長があり、ループ時に境界を越えにくい.
3.vectorとその便利な長さの変更(resize).元の配列が長さが足りない場合は、1つを再定義し、手動で新しい配列にコピーしなければなりません.面倒で死にます.カプセル化すれば、実際にvectorがやったことをもう一度やった.
 
もちろんvector機能はそれだけではありませんが、今回は元の配列に代わるメリットについて議論します.
上段のコードは次のように置き換えられます.
 std::vector<int> a(256, 0);
for (int i = 0; i < 1000000; ++i)
{
 for (size_t j = 0; j < a.size(); ++j)
 {
a[j] = 10 * j; 
 }
 }

効率は?vectorの中も原始配列で、1層パッケージされていて、原始配列より遅くないのではないでしょうか.私も最初はそう思っていましたが、テストの結果は私の予想を大きく上回っていました.
以上の2つのコードをテストしてみましたが、元の配列は少し遅いです.コンパイラはg++4.3.2-O 2最適化
vectorバージョン249 ms
元の配列バージョン251 ms
二.まだ関数ポインタを使っていますか.残念ながら、C言語は設計時に関数が第1クラスの値に設計されているわけではありません.C++は最初はありませんでしたが、boost::function(標準ライブラリに追加され、std::function)が現れてから、C++の関数は基本的に第1のクラスの値として使用できます.
int g(int a)
{
 return a * 10; 
} 

 int f(std::function<int (int)> callback, int a)
 { 
 return callback(a);
  } 
 std::function<int (int)> callback = g; 
f(callback, 1000);

C           ,       C    。C++             。

 

std::function  lambda     std::bind    ,C++         


int g(shared_ptr<int> count)
{
 return ++(*count);
}
 int f() 
 {
 std::function<int (void)> counter = std::bind(&g, std::make_shared<int>(0));
std::cout << count(); 
std::cout << count();
}


 
雲風は彼のブログで、閉鎖的な言語がないのは苦痛で、彼は何とかC言語に閉鎖を加えたいと言った.なぜC++を使わないのかと言いたいのですが.
三.まだnewポインタにいますか?針は核兵器で,敵を千人殺して八百を自傷した.時には針が伝わってきて、最後に釈放を忘れた.スマートポインタの出現はC++一度の飛越である.
auto a = std::make_shared(0);autoに合わせて、c++コードはとても簡潔で、性能はどうですか?私はテストしたことがあります.上の部分はint*a=new intより倍遅く、その大きな利点に比べて、速度はもう十分速いです.
shared_ptrは万能良薬ではなく、不適切な使用はより深刻な結果をもたらす.たとえば、メモリリークツールでもチェックできません.だから、share_ptrがもたらすのは文法的なツールであり、変数のライフサイクルをより明確にする必要があります.
 
C言語は偉大な言語であり、完璧な言語であることを意味しない.C++はそれに対して多くの改善があって、私达はC++を使う时その精華を取って、その粕を取り除くことができます.