おそらく明日から役にたつC++11新機能

969 views
874 views

Published on

STL使って無くてMFCだけの人向けのC++11の説明のつもり

Published in: Software
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
969
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

おそらく明日から役にたつC++11新機能

  1. 1. おそらく明日から役にたつ C++11新機能(前編) Kenta IDA
  2. 2. C++11とは  2011年に標準化されたC++の規格の新しいバージョン  今までのC++規格バージョン  C++98(1998年)  C++03(2003年)  2014年(今年!)に新しいバージョン出る予定  当然C++14と呼ばれることになる…はず  2014年に出れば
  3. 3. C++11とは  新しいバージョンなので…  当然,いろいろ新機能あり  たくさんあるので内容は書けません…  今回は業務で役に立つと思われる機能に絞って紹介
  4. 4. VISUAL STUDIO 2012で使える機能  まだC++11の全機能の一部しか実装されていない  Visual Studio 2013では少し使える機能が増えた  2013使いたい…  何が使えるかはMicrosoftが情報を公開している  http://msdn.microsoft.com/ja-jp/library/hh567368.aspx  表で半分くらいに見えるが大きい機能の未実装多い  多分C++の魔法使いが見たら発狂するレベル  Variadic Tempaltesが… constexprが…  一部業務で便利な機能も未実装  delegating constructorsが…→2013で実装されました
  5. 5. VISUAL STUDIO 2012で使える機能  Visual Studio 2012で使えるC++11機能で便利な機能  型推論 (type inference)  unique_ptr  smart_ptr  範囲ベースのfor-loop (range based for-loop)  長くなるので今回はやめました  iteratorの説明とか無理…
  6. 6. 型推論 (TYPE INFERENCE)  変数の型をコンパイラに計算させる機能  変数の型が複雑な時に有効  C++のテンプレートを使うと型名が複雑になるので書いてられない…  変数宣言時の型名に”auto”と書く  例: auto i = 123; // iはint型 auto s = “hoge”; // sはchar*型 vector<int> v; auto it = v.begin(); // itはvector<int>::iterator型 // (v.begin()の戻り値の型) vector<int>::iterator it = v.begin(); // ↑はこれと等価
  7. 7. 型推論 (TYPE INFERENCE)  よくある誤解  型チェックされないのでバグが多くなる →型チェックされます auto o = new Hoge(); o = 1; // コンパイルエラー  実行時にオーバーヘッドが増えて遅くなる →増えません.コンパイル時に型が決るので実行時は変わらない. auto o = new Hoge(); // Hoge* o = new Hoge();と等価
  8. 8. 型推論 (TYPE INFERENCE)  使いすぎ注意?  使いすぎると型が分からなくなる危険性アリ?  Visual Studio使ってるなら問題ない  Intellisenseで出てきます.  型分からなくならない.  VS使わないから~というのは無しの方向で  折角のMSDN Subscription高いので有効活用しましょう
  9. 9. UNIQUE_PTR  ゆにーくぽいんたと読む  スマートポインタの一種  使わなくなったら勝手にdeleteしてくれる  メモリ管理が楽になる
  10. 10. UNIQUE_PTRの使用前 class Hoge { Fuga* fuga; Hoge() { this->fuga = new Fuga(); } void DoSomething() { this->fuga->DoSomething(); } ~Hoge() { delete this->fuga; this->fuga = NULL; } }
  11. 11. UNIQUE_PTRの使用後 class Hoge { unique_ptr<Fuga> fuga; Hoge() { this->fuga.reset(new Fuga()); } void DoSomething() { this->fuga->DoSomething(); } ~Hoge() { // nothing to do } }
  12. 12. UNIQUE_PTR使用上の注意  同時に1カ所からのみ参照できる  以下のコードはNG unique_ptr<Fuga> a(new Fuga()); { unique_ptr<Fuga> b = a; b.DoSomething(); // OK. bは所有権もっている } // bが破棄される→bの中身も破棄される a.DoSomething(); // NG. null参照  他のunique_ptrに代入すると所有権が移動  元のunique_ptrからは参照不可  所有権を持つunique_ptrが破棄されるときに中のポインタがdeleteされ る
  13. 13. 余談  以下の使い方はすべきで無い void DoSomething() { unique_ptr<Fuga> fuga(new Fuga()); fuga->DoSomething(); }  スタックに確保すれば良い void DoSomething() { Fuga fuga; fuga.DoSomething(); }
  14. 14. SMART_PTR  共有可能なスマートポインタ  同時に複数の場所から参照可能  スマートポインタの一種  使わなくなったら勝手にdeleteしてくれる  unique_ptrと同じ  メモリ管理が楽になる
  15. 15. SMART_PTR使用例  unique_ptrと異なり同時に複数箇所から参照可能  以下のコードもOK smart_ptr<Fuga> a(new Fuga()); { smart_ptr<Fuga> b = a; b.DoSomething(); // OK. } a.DoSomething(); // OK.  他のsmart_ptrに代入しても所有権は移動しない  代わりに参照されている回数がカウントアップされる(参照カウンタ)  smart_ptrが破棄されるとカウントダウンされる  参照カウンタが0になると中身も削除される
  16. 16. UNIQUE_PTR/SMART_PTR使いどころ  使わない理由は無い  生ポインタはdelete忘れ起きる  生ポ禁止  unique_ptr/smart_ptrの使い分けは必要  smart_ptrは参照カウンタの確保が必要 →構築時にオーバーヘッド  unique_ptrで良い場合はunique_ptr  1つのインスタンスからのみ参照される場合  それ以外の場合はsmart_ptr
  17. 17. SMART_PTR余談  生ポ禁止と言っても古いコードが云々…  C++11じゃなくても使えます.Boostを使えば.  BoostがないC++とかC++じゃないという話もある  ライセンス非常に緩いので入れても問題ないのでは  ソースコードにライセンス表記残っていればOK  PC以外の組み込みでも使いたい  C言語高級アセンブラで書かれていることが多い  使えないorz

×