最近のc++ @ sapporo.cpp #5

36
2013/12/07 最近のC++ Sapporo.cpp 1 2013127日土曜日

Upload: kohsuke-yuasa

Post on 31-May-2015

2.672 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 最近のC++ @ Sapporo.cpp #5

2013/12/07

最近のC++

Sapporo.cpp

1

2013年12月7日土曜日

Page 2: 最近のC++ @ Sapporo.cpp #5

あわせて読みたい

✤ C++標準化委員会の江添さんの資料✤ http://ezoeryou.github.io/cpp-history/index.html#/

2

2013年12月7日土曜日

Page 3: 最近のC++ @ Sapporo.cpp #5

C++とは

✤ Bjarne Stroustrupが開発した、静的型付きマルチパラダイム言語

✤以下のようなパラダイムをサポート✤ 手続き的プログラミング✤ オブジェクト指向プログラミング✤ ジェネリックプログラミング

3

2013年12月7日土曜日

Page 4: 最近のC++ @ Sapporo.cpp #5

C++の歴史✤ C with Classes✤ C++ (Release 1.0)✤ C++ (Release 2.0)✤ C++ (Release 3.0)

✤ C++98✤ C++03✤ C++ TR1✤ C++11

✤ C++14✤ C++17

4

2013年12月7日土曜日

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

C++の歴史✤ C with Classes

✤ 1980年頃✤ クラス/派生クラスの機能

✤ 仮想関数はまだ無い✤ コンストラクタ/デストラクタ✤ friendクラス✤ インライン関数✤ 関数のデフォルト引数✤ 代入演算子のオーバーロード✤ などなど

5

2013年12月7日土曜日

Page 6: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C with ClassesからC++へ✤ 1983年頃

6

2013年12月7日土曜日

Page 7: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C++ (Release 1.0)✤ 1986年✤ 仮想関数✤ 関数名/演算子のオーバーロード✤ 参照✤ 定数

✤ readonlyキーワード(現在のconstに相当)✤ 一行コメント✤ などなど

7

2013年12月7日土曜日

Page 8: 最近のC++ @ Sapporo.cpp #5

C++の歴史✤ C++ (Release 2.0)

✤ 1989年✤ 多重継承✤ 抽象クラス✤ staticメンバ関数✤ constメンバ関数✤ 抽象クラス(純粋仮想関数)✤ ->演算子のオーバーロード✤ protectedメンバ✤ などなど

8

2013年12月7日土曜日

Page 9: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C++ (Release 3.0)✤ 1991年✤ テンプレート✤ 例外処理 (Release 3.0の変種にて)

9

2013年12月7日土曜日

Page 10: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ ANSI/ISO 標準規格草案✤ 1996年✤ 名前空間✤ mutableキーワード✤ メンバテンプレート✤ 実行時型情報✤ bool型✤ などなど

10

2013年12月7日土曜日

Page 11: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C++98✤ ISO/IEC 14882:1998✤ C++初の標準規格

11

2013年12月7日土曜日

Page 12: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C++03✤ ISO/IEC 14882:2003✤ C++98のバグフィックス的なもの

12

2013年12月7日土曜日

Page 13: 最近のC++ @ Sapporo.cpp #5

C++の歴史

✤ C++ TR1✤ ISO/IEC TR 19768:2007“Draft Technical Report on C++ Librarie Extensions”

✤ C++のこれまでの知見を元に、ハッシュテーブルやスマートポインタなど、ライブラリ関係で今後のC++標準に追加されるであろう機能をまとめたもの。

✤ →若干の修正を経て、実際に、この次の規格”C++11”に追加された。

13

2013年12月7日土曜日

Page 14: 最近のC++ @ Sapporo.cpp #5

現在のC++

✤ C++11✤ ISO/IEC 14882:2011✤ 現在のC++の標準規格✤ C++03から言語機能を大幅に拡張しつつ、過去との互換性は最大限残している

✤ 規格策定前は”C++0x”と呼ばれていた

14

2013年12月7日土曜日

Page 15: 最近のC++ @ Sapporo.cpp #5

C++03 → C++11✤言語機能の追加

✤ ムーブセマンティクス✤ auto, decltypeなど型推論の機能✤ 定数式(constexpr)✤ Range-based for✤ ラムダ式✤ nullptr✤ override/final✤ 可変長テンプレート✤ などなど

15

2013年12月7日土曜日

Page 16: 最近のC++ @ Sapporo.cpp #5

C++03 → C++11✤ライブラリの追加

✤ <array> : 配列クラス✤ <atomic> : アトミック変数✤ <thread>/<mutex>/<future> : マルチスレッド関係✤ <chrono> : 時間計算✤ <unordered_map> : ハッシュマップ✤ <random> : 乱数ライブラリ✤ <regex> : 正規表現✤ <function> : 関数オブジェクトクラス✤ などなど

16

2013年12月7日土曜日

Page 17: 最近のC++ @ Sapporo.cpp #5

C++11の利点

✤ C++03からC++11になってどんなことが可能になったか。✤ ムーブセマンティクスによって効率的なプログラミング✤ ラムダ式によって直感的なプログラミング✤ Range-based forによって簡潔なプログラミング

17

2013年12月7日土曜日

Page 18: 最近のC++ @ Sapporo.cpp #5

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日土曜日

Page 19: 最近のC++ @ Sapporo.cpp #5

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");

19

ムーブ可能な型は、ムーブの文脈においてコピーよりも効率的な所有権の移動を実現する。vectorでは、コピーの代わりにムーブを使用すると、内部の配列データを指すポインタだけを移しかえたりする。

2013年12月7日土曜日

Page 20: 最近のC++ @ Sapporo.cpp #5

std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); });

20

2013年12月7日土曜日

Page 21: 最近のC++ @ Sapporo.cpp #5

std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); }); th.join();

21

std::threadクラスは、コンストラクタで関数や関数オブジェクトやラムダ式のような”呼び出し可能な何か”を受け取り、それを別スレッドで呼び出す。

2013年12月7日土曜日

Page 22: 最近のC++ @ Sapporo.cpp #5

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日土曜日

Page 23: 最近のC++ @ Sapporo.cpp #5

template<class Container>void ProcessData(Container &container){ // Range-based forですべての要素を辿る for(Data &data: container) { process_one_data(data); std::cout << data.result() << std::endl; }}

23

Range-based forは配列やbegin(), end()メンバ関数を持つクラスなどからすべての要素を渡る。

2013年12月7日土曜日

Page 24: 最近のC++ @ Sapporo.cpp #5

これからのC++

✤ C++14✤ C++17

24

2013年12月7日土曜日

Page 25: 最近のC++ @ Sapporo.cpp #5

C++14

✤ 2014年策定を目指して作業が進んでいるC++の新しい規格

✤ C++11の言語仕様に対する、バグフィックスといくつかの改善(C++98に対するC++03のようなもの)

25

2013年12月7日土曜日

Page 26: 最近のC++ @ Sapporo.cpp #5

C++14

✤言語機能✤ 2進数リテラルサポート✤ 数値区切り✤ 実行時サイズ配列(VLA)✤ 汎用ラムダキャプチャー✤ [[deprecated]]✤ 関数の戻り値の型推定✤ constexpr関数の制限緩和✤ などなど

26

2013年12月7日土曜日

Page 27: 最近のC++ @ Sapporo.cpp #5

C++14✤ライブラリ

✤ make_unique()✤ コンパイル時整数シーケンス✤ 共有ロック✤ exchange()関数✤ エイリアステンプレート版のType Traits✤ std::complexのユーザー定義リテラル✤ 文字列オブジェクトリテラル✤ 時間リテラル✤ などなど

27

2013年12月7日土曜日

Page 28: 最近のC++ @ Sapporo.cpp #5

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日土曜日

Page 29: 最近のC++ @ Sapporo.cpp #5

C++17

✤ C++の次のメジャーアップデートとして予定されている規格

✤ただし、2017年に策定されると決まっているわけではない

✤以前はC++1yと呼ばれていた

29

2013年12月7日土曜日

Page 30: 最近のC++ @ Sapporo.cpp #5

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日土曜日

Page 32: 最近のC++ @ Sapporo.cpp #5

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; }}

32

※)Boost.Filesystemの例

2013年12月7日土曜日

Page 33: 最近のC++ @ Sapporo.cpp #5

33

例)Parallelism TS

✤ CUDAのThrustライブラリの設計を参考に、STLのアルゴリズムに並列計算の機能を加える

2013年12月7日土曜日

Page 34: 最近のC++ @ Sapporo.cpp #5

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日土曜日

Page 35: 最近のC++ @ Sapporo.cpp #5

C++17

✤ 2017年を目指し、新たな言語仕様とTSとを統合して、メジャーアップデート

35

2013年12月7日土曜日

Page 36: 最近のC++ @ Sapporo.cpp #5

ロードマップ

36

http://isocpp.org/std/status

2013年12月7日土曜日