まず、いくつかの経験則:
std::unique_ptr
オーバーヘッドなしのスマートポインターとして使用します。あまり頻繁に生のポインタを気にする必要はありません。std::shared_ptr
ほとんどの場合、同様に不要です。所有権を共有したいという願望は、多くの場合、そもそも所有権についての思考不足に裏打ちされます。
std::array
静的長配列およびstd::vector
動的配列に使用します。
特に、一般的なアルゴリズムを広範囲に使用します。
<algorithm>
<numeric>
<iterator>
<functional>
読みやすい場所で使用auto
しdecltype()
ます。特に、イテレータや複雑なテンプレート型など、気にしない型のものを宣言する場合は、を使用しますauto
。別の物の型に関して物を宣言したい場合、を使用しますdecltype()
。
可能な場合は、タイプセーフにします。特定の種類の事物に不変条件を強制するアサーションがある場合、そのロジックは型に集中させることができます。そして、これは必ずしも実行時のオーバーヘッドにはなりません。また、Cスタイルキャスト((T)x
)を避けて、より明示的(かつ検索可能)なC ++スタイルキャスト(例:)を優先することも言うまでもありませんstatic_cast
。
最後に、次の3つのルールを理解します。
移動コンストラクターと移動代入演算子が追加された5つのルールになっています。また、右辺値参照全般とコピーを回避する方法を理解します。
C ++は複雑な言語であるため、C ++のすべてを最適に使用する方法を特徴付けることは困難です。しかし、優れたC ++開発のプラクティスは、C ++ 11で根本的に変更されていません。手動のメモリ管理よりもメモリ管理コンテナを優先する必要があります。スマートポインタを使用すると、効率的にこれを簡単に実行できます。
実際、現代のC ++にはほとんど手動のメモリ管理がありません。C++のメモリモデルの利点は、手動ではなく決定論的であることです。予測可能な割り当て解除により、予測可能なパフォーマンスが向上します。
コンパイラーに関しては、G ++とClangはどちらもC ++ 11機能の点で競争力があり、それらの欠陥を急速に追いついています。私はVisual Studioを使用していないので、賛成も反対もできません。
最後に、std::for_each
一般的なことは避けてください。
transform
、accumulate
、及びerase
- remove_if
機能古き良きありmap
、fold
とfilter
。しかしfor_each
、より一般的であるため、意味がありません。ループ以外の意図はありません。それに加えて、範囲ベースと同じ状況で使用され、for
ポイントフリーで使用された場合でも、構文的に重いです。考慮してください:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);