最近やすかったので、Effective Modern C++買ってみたら、
思っていた以上に使いやすそうなので今後C++11に移行したいと思ってる。
「C++11のいい教科書やまとめ」ってググってもなんもでないし。
とか思いながら、ふと「C++11」や「C++14」だけでググったら、
結構色々出てきたw
今の不十分な理解で好きなC++11の機能は、以下の機能。
- std::move
- alias
- auto
- range
- lamda式
- スマートポインタ
- constexpr
- noexcept
- const function
まず、std::move!これは、これまではコピーしかできなかったC言語に、
新しく移動、つまり元の値を壊していいという新しいsemanticsを追加した物です。
semanticsて何?というと長い話になるので割愛。
素晴らしい点は「移動」できるという機能を汎用的に定義し宣言した点です。
これまでも「移動」の概念自体はありましたが、汎用的ではなかったので、
これを利用して性能向上しようなどという話はありませんでした。今回、
何でも「移動」できるようになったため、色々最適化できるようになりました。
例えば、このstd::moveがあると、こんな事ができるのです。
class test {これの何が凄いかというと、std::stringのコンストラクタが1回しか呼ばれない点です。
std::string name;
public:
void setName(std::string str) { name = std::move(str); }
};
これまで、
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 件のコメント:
コメントを投稿