C++11、C++14

2014年9月6日土曜日

プログラム

t f B! P L
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だ!

ラベル

AndroidTV (1) chromebook (2) DIY (4) docker (1) git (4) Ingress (4) llvm (3) MacBook (1) MVNO (1) narou (1) PS4 (2) QNAPNAS (9) SIMD (9) SmartBand (8) Ubuntu (9) VAIO (1) Windows (2) wsl (2) wsl2 (1) Xperia (20) トルネ (3) プログラム (26) ルーター (18) 音楽 (6) 家事 (2) 自炊 (2) 電子書籍 (2) 洋食 (4)

フォロワー

QooQ