最近のC++ @ Sapporo.cpp #5

  • 2,406 views
Uploaded on

Sapporo.cpp 札幌C++勉強会 #5で発表した、最近のC++の流れを紹介した資料。

Sapporo.cpp 札幌C++勉強会 #5で発表した、最近のC++の流れを紹介した資料。

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

Views

Total Views
2,406
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
8
Comments
0
Likes
5

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++ Sapporo.cpp 2013/12/07 1 2013年12月7日土曜日
  • 2. あわせて読みたい ✤ C++標準化委員会の江添さんの資料 ✤ http://ezoeryou.github.io/cpp-history/index.html#/ 2 2013年12月7日土曜日
  • 3. C++とは ✤ ✤ Bjarne Stroustrupが開発した、 静的型付きマルチパラダイム言語 以下のようなパラダイムをサポート ✤ 手続き的プログラミング ✤ オブジェクト指向プログラミング ✤ ジェネリックプログラミング 3 2013年12月7日土曜日
  • 4. C++の歴史 ✤ C with Classes ✤ C++98 ✤ C++14 ✤ C++ (Release 1.0) ✤ C++03 ✤ C++17 ✤ C++ (Release 2.0) ✤ C++ TR1 ✤ C++ (Release 3.0) ✤ C++11 4 2013年12月7日土曜日
  • 5. C++の歴史 ✤ C with Classes ✤ 1980年頃 ✤ クラス/派生クラスの機能 ✤ 仮想関数はまだ無い ✤ コンストラクタ/デストラクタ ✤ friendクラス ✤ インライン関数 ✤ 関数のデフォルト引数 ✤ 代入演算子のオーバーロード ✤ などなど 5 2013年12月7日土曜日
  • 6. C++の歴史 ✤ C with ClassesからC++へ ✤ 1983年頃 6 2013年12月7日土曜日
  • 7. C++の歴史 ✤ C++ (Release 1.0) ✤ 1986年 ✤ 仮想関数 ✤ 関数名/演算子のオーバーロード ✤ 参照 ✤ 定数 ✤ readonlyキーワード(現在のconstに相当) ✤ 一行コメント ✤ などなど 7 2013年12月7日土曜日
  • 8. C++の歴史 ✤ C++ (Release 2.0) ✤ 1989年 ✤ 多重継承 ✤ 抽象クラス ✤ staticメンバ関数 ✤ constメンバ関数 ✤ 抽象クラス(純粋仮想関数) ✤ ->演算子のオーバーロード ✤ protectedメンバ ✤ などなど 8 2013年12月7日土曜日
  • 9. C++の歴史 ✤ C++ (Release 3.0) ✤ 1991年 ✤ テンプレート ✤ 例外処理 (Release 3.0の変種にて) 9 2013年12月7日土曜日
  • 10. C++の歴史 ✤ ANSI/ISO 標準規格草案 ✤ 1996年 ✤ 名前空間 ✤ mutableキーワード ✤ メンバテンプレート ✤ 実行時型情報 ✤ bool型 ✤ などなど 10 2013年12月7日土曜日
  • 11. C++の歴史 ✤ C++98 ✤ ISO/IEC 14882:1998 ✤ C++初の標準規格 11 2013年12月7日土曜日
  • 12. C++の歴史 ✤ C++03 ✤ ISO/IEC 14882:2003 ✤ C++98のバグフィックス的なもの 12 2013年12月7日土曜日
  • 13. C++の歴史 ✤ C++ TR1 ✤ ✤ ✤ ISO/IEC TR 19768:2007 Draft Technical Report on C++ Librarie Extensions C++のこれまでの知見を元に、 ハッシュテーブルやスマートポインタなど、 ライブラリ関係で今後のC++標準に 追加されるであろう機能をまとめたもの。 →若干の修正を経て、実際に、 この次の規格 C++11 に追加された。 13 2013年12月7日土曜日
  • 14. 現在のC++ ✤ C++11 ✤ ISO/IEC 14882:2011 ✤ 現在のC++の標準規格 ✤ ✤ C++03から言語機能を大幅に拡張しつつ、過去との互換 性は最大限残している 規格策定前は C++0x と呼ばれていた 14 2013年12月7日土曜日
  • 15. C++03 → C++11 ✤ 言語機能の追加 ✤ ムーブセマンティクス ✤ auto, decltypeなど型推論の機能 ✤ 定数式(constexpr) ✤ Range-based for ✤ ラムダ式 ✤ nullptr ✤ override/final ✤ 可変長テンプレート ✤ などなど 15 2013年12月7日土曜日
  • 16. C++03 → C++11 ✤ ライブラリの追加 ✤ <array> : 配列クラス ✤ <atomic> : アトミック変数 ✤ <thread>/<mutex>/<future> : マルチスレッド関係 ✤ <chrono> : 時間計算 ✤ <unordered_map> : ハッシュマップ ✤ <random> : 乱数ライブラリ ✤ <regex> : 正規表現 ✤ <function> : 関数オブジェクトクラス ✤ などなど 16 2013年12月7日土曜日
  • 17. C++11の利点 ✤ C++03からC++11になってどんなことが可能に なったか。 ✤ ムーブセマンティクスによって効率的なプログラミング ✤ ラムダ式によって直感的なプログラミング ✤ Range-based forによって簡潔なプログラミング 17 2013年12月7日土曜日
  • 18. std::vector<Data> ReadData(std::string filepath) { std::ifstream ifs(filepath.c_str()); std::vector<Data> ret; //! 何らかのデータ読み込み for( ; ; ) { Data d = read_one_data(ifs); if(!ifs) { break; } ret.push_back(std::move(d)); // ムーブ } return ret; // 戻り値は暗黙的に自動でムーブ } std::vector<Data> file_data = ReadData("DataFile.dat"); 18 2013年12月7日土曜日
  • 19. std::vector<Data> ReadData(std::string filepath) { std::ifstream ifs(filepath.c_str()); std::vector<Data> ret; //! 何らかのデータ読み込み for( ; ; ) { Data d = read_one_data(ifs); if(!ifs) { break; } ret.push_back(std::move(d)); // ムーブ } return ret; // 戻り値は暗黙的に自動でムーブ } ムーブ可能な型は、ムーブの文脈においてコピーよりも効率 的な所有権の移動を実現する。 std::vector<Data> file_data = ReadData("DataFile.dat"); vectorでは、コピーの代わりにムーブを使用すると、内部 の配列データを指すポインタだけを移しかえたりする。 19 2013年12月7日土曜日
  • 20. std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); }); 20 2013年12月7日土曜日
  • 21. std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); }); std::threadクラスは、コンストラクタで th.join(); 関数や関数オブジェクトやラムダ式のような ”呼び出し可能な何か”を受け取り、 それを別スレッドで呼び出す。 21 2013年12月7日土曜日
  • 22. template<class Container> void ProcessData(Container &container) { // Range-based forですべての要素を辿る for(Data &data: container) { process_one_data(data); std::cout << data.result() << std::endl; } } 22 2013年12月7日土曜日
  • 23. template<class Container> void ProcessData(Container &container) { // Range-based forですべての要素を辿る for(Data &data: container) { process_one_data(data); std::cout << data.result() << std::endl; } } Range-based forは配列やbegin(), end()メ ンバ関数を持つクラスなどからすべての要素 を渡る。 23 2013年12月7日土曜日
  • 24. これからのC++ ✤ C++14 ✤ C++17 24 2013年12月7日土曜日
  • 25. C++14 ✤ ✤ 2014年策定を目指して作業が進んでいるC++の 新しい規格 C++11の言語仕様に対する、バグフィックスと いくつかの改善(C++98に対するC++03のよう なもの) 25 2013年12月7日土曜日
  • 26. C++14 ✤ 言語機能 ✤ 2進数リテラルサポート ✤ 数値区切り ✤ 実行時サイズ配列(VLA) ✤ 汎用ラムダキャプチャー ✤ [[deprecated]] ✤ 関数の戻り値の型推定 ✤ constexpr関数の制限緩和 ✤ などなど 26 2013年12月7日土曜日
  • 27. C++14 ✤ ライブラリ ✤ make_unique() ✤ コンパイル時整数シーケンス ✤ 共有ロック ✤ exchange()関数 ✤ エイリアステンプレート版のType Traits ✤ std::complexのユーザー定義リテラル ✤ 文字列オブジェクトリテラル ✤ 時間リテラル ✤ などなど 27 2013年12月7日土曜日
  • 28. C++14まとめ記事 ✤ 「C++14の新機能」 http://ezoeryou.github.io/kabukiza-tech2-slide/#/ ✤ 「C++14にやってくる見た目に分かりやすい新機能」 http://cpplover.blogspot.jp/2013/05/c14.html ✤ 「C++14の言語拡張まとめ」 http://d.hatena.ne.jp/faith_and_brave/20131122/1385094436 28 2013年12月7日土曜日
  • 29. C++17 ✤ ✤ ✤ C++の次のメジャーアップデートとして予定され ている規格 ただし、2017年に策定されると決まっているわ けではない 以前はC++1yと呼ばれていた 29 2013年12月7日土曜日
  • 30. C++17までのプロセス ✤ C++14とその後に続く言語仕様の策定作業と並 行して、TS(Technical Specification)と呼ばれる、特定の 機能に話題を絞ったドキュメントを作成 ✤ Filesystem TS ✤ Networking TS ✤ Concepts Lite TS ✤ Library Fundamentals TS ✤ Array Extensions TS ✤ Extensions of Concurrency ✤ Extensions of Parallelism 30 2013年12月7日土曜日
  • 31. 例)Filesystem TS ✤ Boost.Filesystemを元に設計 ✤ http://www.open-std.org/jtc1/sc22/wg21/docs/ papers/2013/n3803.pdf 31 2013年12月7日土曜日
  • 32. namespace fs = boost::filesystem; int main() { const fs::path path("dir1/a.txt"); // コピー元 const fs::path dest("dir2/a.txt"); // コピー先 try { fs::copy_file(path, dest); } catch (fs::filesystem_error& ex) { std::cout << ex.what() << std::endl; throw; } } ※)Boost.Filesystemの例 32 2013年12月7日土曜日
  • 33. 例)Parallelism TS ✤ CUDAのThrustライブラリの設計を参考に、 STLのアルゴリズムに並列計算の機能を加える 33 2013年12月7日土曜日
  • 34. std::vector<int> vec = ... // これまで通りの、シーケンシャルソート std::sort(vec.begin(), vec.end()); // 明示的なシーケンシャルソート std::sort(std::seq, vec.begin(), vec.end()); // 並列実行の許可 std::sort(std::par, vec.begin(), vec.end()); 34 2013年12月7日土曜日
  • 35. C++17 ✤ 2017年を目指し、新たな言語仕様とTSとを統合 して、メジャーアップデート 35 2013年12月7日土曜日
  • 36. ロードマップ http://isocpp.org/std/status 36 2013年12月7日土曜日