2014年9月6日土曜日

C++11、C++14

C++11のいい教科書やまとめってなんかないかね。

最近やすかったので、Effective Modern C++買ってみたら、
思っていた以上に使いやすそうなので今後C++11に移行したいと思ってる。

「C++11のいい教科書やまとめ」ってググってもなんもでないし。
とか思いながら、ふと「C++11」や「C++14」だけでググったら、
結構色々出てきたw

今の不十分な理解で好きなC++11の機能は、以下の機能。
  • std::move
  • alias
  • auto
  • range
  • lamda式
  • スマートポインタ
  • constexpr
  • noexcept
  • const function
簡単にmoveとlamda式について説明してみる。

まず、std::move!これは、これまではコピーしかできなかったC言語に、
新しく移動、つまり元の値を壊していいという新しいsemanticsを追加した物です。

semanticsて何?というと長い話になるので割愛。
素晴らしい点は「移動」できるという機能を汎用的に定義し宣言した点です。
これまでも「移動」の概念自体はありましたが、汎用的ではなかったので、
これを利用して性能向上しようなどという話はありませんでした。今回、
何でも「移動」できるようになったため、色々最適化できるようになりました。

例えば、このstd::moveがあると、こんな事ができるのです。
class test {
    std::string name;
public:
    void setName(std::string str) { name = std::move(str); }
};
これの何が凄いかというと、std::stringのコンストラクタが1回しか呼ばれない点です。

これまで、
    void setName(const std::string& str) { name = str; }
という書き方をしていましたが、これだとsetName("hello");とすると、
関数呼び出し前にコンストラクタが1回、内部の代入でメモリ割り当てが1回と、
重い処理が2回走ってました。

ですがこれからは値渡しの1関数だけでOk、素晴らしい!!!
どんな場合でも関数呼び出し前にコンストラクタが1回走るだけです。
setterの中で例外が発生しにくい点もいいですね。 
これだけでC++98捨てるのに躊躇ありません。

lamda式は、algorithmを使って関数オブジェクト書いてた人だけ、
嬉しい機能です。これまでは関数オブジェクトを利用する関数の外側とか、
凄く離れた位置に処理内容を書く必要がありました。

これが、algorithmを使うその場所で、関数オブジェクトの内容を、
新しいlambda式の形で書けるようになりました。素晴らしい!!!

更に、これまでは関数オブジェクトのクラスの中に、
関数オブジェクト内部で使うパラメータのスレッショルド値や、
計算中の最大値の格納場所を用意しないといけなかったのに、
これをlambda式のすぐ外の自動変数を参照することが
できるようになったんですね。これがlambda式の[=]や[&]構文。
unsigned int max = 0;
for_each(vec.begin(), vec.end(),
    [&](unsigned int i){ max = std::max(max, i); });
みたいな。凄えぜ。

さあ、皆もC++98を窓から投げ捨てろ!
明日からC++11だ!

0 件のコメント:

コメントを投稿