最近のc++ @ sapporo.cpp #5
DESCRIPTION
Sapporo.cpp 札幌C++勉強会 #5で発表した、最近のC++の流れを紹介した資料。TRANSCRIPT
2013/12/07
最近のC++
Sapporo.cpp
1
2013年12月7日土曜日
あわせて読みたい
✤ C++標準化委員会の江添さんの資料✤ http://ezoeryou.github.io/cpp-history/index.html#/
2
2013年12月7日土曜日
C++とは
✤ Bjarne Stroustrupが開発した、静的型付きマルチパラダイム言語
✤以下のようなパラダイムをサポート✤ 手続き的プログラミング✤ オブジェクト指向プログラミング✤ ジェネリックプログラミング
3
2013年12月7日土曜日
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日土曜日
C++の歴史✤ C with Classes
✤ 1980年頃✤ クラス/派生クラスの機能
✤ 仮想関数はまだ無い✤ コンストラクタ/デストラクタ✤ friendクラス✤ インライン関数✤ 関数のデフォルト引数✤ 代入演算子のオーバーロード✤ などなど
5
2013年12月7日土曜日
C++の歴史
✤ C with ClassesからC++へ✤ 1983年頃
6
2013年12月7日土曜日
C++の歴史
✤ C++ (Release 1.0)✤ 1986年✤ 仮想関数✤ 関数名/演算子のオーバーロード✤ 参照✤ 定数
✤ readonlyキーワード(現在のconstに相当)✤ 一行コメント✤ などなど
7
2013年12月7日土曜日
C++の歴史✤ C++ (Release 2.0)
✤ 1989年✤ 多重継承✤ 抽象クラス✤ staticメンバ関数✤ constメンバ関数✤ 抽象クラス(純粋仮想関数)✤ ->演算子のオーバーロード✤ protectedメンバ✤ などなど
8
2013年12月7日土曜日
C++の歴史
✤ C++ (Release 3.0)✤ 1991年✤ テンプレート✤ 例外処理 (Release 3.0の変種にて)
9
2013年12月7日土曜日
C++の歴史
✤ ANSI/ISO 標準規格草案✤ 1996年✤ 名前空間✤ mutableキーワード✤ メンバテンプレート✤ 実行時型情報✤ bool型✤ などなど
10
2013年12月7日土曜日
C++の歴史
✤ C++98✤ ISO/IEC 14882:1998✤ C++初の標準規格
11
2013年12月7日土曜日
C++の歴史
✤ C++03✤ ISO/IEC 14882:2003✤ C++98のバグフィックス的なもの
12
2013年12月7日土曜日
C++の歴史
✤ C++ TR1✤ ISO/IEC TR 19768:2007“Draft Technical Report on C++ Librarie Extensions”
✤ C++のこれまでの知見を元に、ハッシュテーブルやスマートポインタなど、ライブラリ関係で今後のC++標準に追加されるであろう機能をまとめたもの。
✤ →若干の修正を経て、実際に、この次の規格”C++11”に追加された。
13
2013年12月7日土曜日
現在のC++
✤ C++11✤ ISO/IEC 14882:2011✤ 現在のC++の標準規格✤ C++03から言語機能を大幅に拡張しつつ、過去との互換性は最大限残している
✤ 規格策定前は”C++0x”と呼ばれていた
14
2013年12月7日土曜日
C++03 → C++11✤言語機能の追加
✤ ムーブセマンティクス✤ auto, decltypeなど型推論の機能✤ 定数式(constexpr)✤ Range-based for✤ ラムダ式✤ nullptr✤ override/final✤ 可変長テンプレート✤ などなど
15
2013年12月7日土曜日
C++03 → C++11✤ライブラリの追加
✤ <array> : 配列クラス✤ <atomic> : アトミック変数✤ <thread>/<mutex>/<future> : マルチスレッド関係✤ <chrono> : 時間計算✤ <unordered_map> : ハッシュマップ✤ <random> : 乱数ライブラリ✤ <regex> : 正規表現✤ <function> : 関数オブジェクトクラス✤ などなど
16
2013年12月7日土曜日
C++11の利点
✤ C++03からC++11になってどんなことが可能になったか。✤ ムーブセマンティクスによって効率的なプログラミング✤ ラムダ式によって直感的なプログラミング✤ Range-based forによって簡潔なプログラミング
17
2013年12月7日土曜日
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日土曜日
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日土曜日
std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); });
20
2013年12月7日土曜日
std::thread th( // スレッドで行う処理をラムダ式で指定 [](std::vector<Data> data) { ProcessData(data); }); th.join();
21
std::threadクラスは、コンストラクタで関数や関数オブジェクトやラムダ式のような”呼び出し可能な何か”を受け取り、それを別スレッドで呼び出す。
2013年12月7日土曜日
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日土曜日
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日土曜日
これからのC++
✤ C++14✤ C++17
24
2013年12月7日土曜日
C++14
✤ 2014年策定を目指して作業が進んでいるC++の新しい規格
✤ C++11の言語仕様に対する、バグフィックスといくつかの改善(C++98に対するC++03のようなもの)
25
2013年12月7日土曜日
C++14
✤言語機能✤ 2進数リテラルサポート✤ 数値区切り✤ 実行時サイズ配列(VLA)✤ 汎用ラムダキャプチャー✤ [[deprecated]]✤ 関数の戻り値の型推定✤ constexpr関数の制限緩和✤ などなど
26
2013年12月7日土曜日
C++14✤ライブラリ
✤ make_unique()✤ コンパイル時整数シーケンス✤ 共有ロック✤ exchange()関数✤ エイリアステンプレート版のType Traits✤ std::complexのユーザー定義リテラル✤ 文字列オブジェクトリテラル✤ 時間リテラル✤ などなど
27
2013年12月7日土曜日
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日土曜日
C++17
✤ C++の次のメジャーアップデートとして予定されている規格
✤ただし、2017年に策定されると決まっているわけではない
✤以前はC++1yと呼ばれていた
29
2013年12月7日土曜日
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日土曜日
例)Filesystem TS
✤ Boost.Filesystemを元に設計✤ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3803.pdf
31
2013年12月7日土曜日
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日土曜日
33
例)Parallelism TS
✤ CUDAのThrustライブラリの設計を参考に、STLのアルゴリズムに並列計算の機能を加える
2013年12月7日土曜日
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日土曜日
C++17
✤ 2017年を目指し、新たな言語仕様とTSとを統合して、メジャーアップデート
35
2013年12月7日土曜日
ロードマップ
36
http://isocpp.org/std/status
2013年12月7日土曜日