• Like
  • Save
おそらく明日から役にたつC++11新機能
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

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

  • 193 views
Published

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

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

Published in Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
193
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. おそらく明日から役にたつ C++11新機能(前編) Kenta IDA
  • 2. C++11とは  2011年に標準化されたC++の規格の新しいバージョン  今までのC++規格バージョン  C++98(1998年)  C++03(2003年)  2014年(今年!)に新しいバージョン出る予定  当然C++14と呼ばれることになる…はず  2014年に出れば
  • 3. C++11とは  新しいバージョンなので…  当然,いろいろ新機能あり  たくさんあるので内容は書けません…  今回は業務で役に立つと思われる機能に絞って紹介
  • 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. VISUAL STUDIO 2012で使える機能  Visual Studio 2012で使えるC++11機能で便利な機能  型推論 (type inference)  unique_ptr  smart_ptr  範囲ベースのfor-loop (range based for-loop)  長くなるので今回はやめました  iteratorの説明とか無理…
  • 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. 型推論 (TYPE INFERENCE)  よくある誤解  型チェックされないのでバグが多くなる →型チェックされます auto o = new Hoge(); o = 1; // コンパイルエラー  実行時にオーバーヘッドが増えて遅くなる →増えません.コンパイル時に型が決るので実行時は変わらない. auto o = new Hoge(); // Hoge* o = new Hoge();と等価
  • 8. 型推論 (TYPE INFERENCE)  使いすぎ注意?  使いすぎると型が分からなくなる危険性アリ?  Visual Studio使ってるなら問題ない  Intellisenseで出てきます.  型分からなくならない.  VS使わないから~というのは無しの方向で  折角のMSDN Subscription高いので有効活用しましょう
  • 9. UNIQUE_PTR  ゆにーくぽいんたと読む  スマートポインタの一種  使わなくなったら勝手にdeleteしてくれる  メモリ管理が楽になる
  • 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. UNIQUE_PTRの使用後 class Hoge { unique_ptr<Fuga> fuga; Hoge() { this->fuga.reset(new Fuga()); } void DoSomething() { this->fuga->DoSomething(); } ~Hoge() { // nothing to do } }
  • 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. 余談  以下の使い方はすべきで無い void DoSomething() { unique_ptr<Fuga> fuga(new Fuga()); fuga->DoSomething(); }  スタックに確保すれば良い void DoSomething() { Fuga fuga; fuga.DoSomething(); }
  • 14. SMART_PTR  共有可能なスマートポインタ  同時に複数の場所から参照可能  スマートポインタの一種  使わなくなったら勝手にdeleteしてくれる  unique_ptrと同じ  メモリ管理が楽になる
  • 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. UNIQUE_PTR/SMART_PTR使いどころ  使わない理由は無い  生ポインタはdelete忘れ起きる  生ポ禁止  unique_ptr/smart_ptrの使い分けは必要  smart_ptrは参照カウンタの確保が必要 →構築時にオーバーヘッド  unique_ptrで良い場合はunique_ptr  1つのインスタンスからのみ参照される場合  それ以外の場合はsmart_ptr
  • 17. SMART_PTR余談  生ポ禁止と言っても古いコードが云々…  C++11じゃなくても使えます.Boostを使えば.  BoostがないC++とかC++じゃないという話もある  ライセンス非常に緩いので入れても問題ないのでは  ソースコードにライセンス表記残っていればOK  PC以外の組み込みでも使いたい  C言語高級アセンブラで書かれていることが多い  使えないorz