最近のC++

Sapporo.cpp
2013/12/07
1
2013年12月7日土曜日
あわせて読みたい

✤

C++標準化委員会の江添さんの資料
✤

http://ezoeryou.github.io/cpp-history/index.html#/

2
2013年12月7日土曜日
C++とは

✤

✤

Bjarne Stroustrupが開発した、
静的型付きマルチパラダイム言語
以下のようなパラダイムをサポート
✤

手続き的プログラミング

✤

オブジェクト指向プログラミング

✤

ジェネリックプログラミング...
C++の歴史
✤

C with Classes

✤

C++98

✤

C++14

✤

C++ (Release 1.0)

✤

C++03

✤

C++17

✤

C++ (Release 2.0)

✤

C++ TR1

...
C++の歴史
✤

C with Classes
✤

1980年頃

✤

クラス/派生クラスの機能
✤

仮想関数はまだ無い

✤

コンストラクタ/デストラクタ

✤

friendクラス

✤

インライン関数

✤

関数のデフォルト...
C++の歴史

✤

C with ClassesからC++へ
✤

1983年頃

6
2013年12月7日土曜日
C++の歴史
✤

C++ (Release 1.0)
✤

1986年

✤

仮想関数

✤

関数名/演算子のオーバーロード

✤

参照

✤

定数
✤

readonlyキーワード(現在のconstに相当)

✤

一行コメント

...
C++の歴史
✤

C++ (Release 2.0)
✤

1989年

✤

多重継承

✤

抽象クラス

✤

staticメンバ関数

✤

constメンバ関数

✤

抽象クラス(純粋仮想関数)

✤

->演算子のオーバーロード...
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
✤

ISO/IEC 14882:2011

✤

現在のC++の標準規格

✤

✤

C++03から言語機能を大幅に拡張しつつ、過去との互換
性は最大限残している
規格策定前は C++0x と呼ばれていた
...
C++03 → C++11
✤

言語機能の追加
✤

ムーブセマンティクス

✤

auto, decltypeなど型推論の機能

✤

定数式(constexpr)

✤

Range-based for

✤

ラムダ式

✤

null...
C++03 → C++11
✤

ライブラリの追加
✤

<array> : 配列クラス

✤

<atomic> : アトミック変数

✤

<thread>/<mutex>/<future> : マルチスレッド関係

✤

<chrono>...
C++11の利点

✤

C++03からC++11になってどんなことが可能に
なったか。
✤

ムーブセマンティクスによって効率的なプログラミング

✤

ラムダ式によって直感的なプログラミング

✤

Range-based forによって簡...
std::vector<Data>
	 
ReadData(std::string	 filepath)
{
	 	 	 	 std::ifstream	 ifs(filepath.c_str());
	 	 	 	 std::vector<D...
std::vector<Data>
	 
ReadData(std::string	 filepath)
{
	 	 	 	 std::ifstream	 ifs(filepath.c_str());
	 	 	 	 std::vector<D...
std::thread	 th(
	 	 	 	 //	 スレッドで行う処理をラムダ式で指定
	 	 	 	 [](std::vector<Data>	 data)	 {
	 	 	 	 	 	 	 	 ProcessData(data);
	...
std::thread	 th(
	 	 	 	 //	 スレッドで行う処理をラムダ式で指定
	 	 	 	 [](std::vector<Data>	 data)	 {
	 	 	 	 	 	 	 	 ProcessData(data);
	...
template<class	 Container>
void	 ProcessData(Container	 &container)
{
	 	 	 	 //	 Range-based	 forですべての要素を辿る
	 
for(Data	 ...
template<class	 Container>
void	 ProcessData(Container	 &container)
{
	 	 	 	 //	 Range-based	 forですべての要素を辿る
	 
for(Data	 ...
これからの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関数...
C++14
✤

ライブラリ
✤

make_unique()

✤

コンパイル時整数シーケンス

✤

共有ロック

✤

exchange()関数

✤

エイリアステンプレート版のType Traits

✤

std::complex...
C++14まとめ記事

✤

「C++14の新機能」
http://ezoeryou.github.io/kabukiza-tech2-slide/#/

✤

「C++14にやってくる見た目に分かりやすい新機能」
http://cpplove...
C++17

✤

✤

✤

C++の次のメジャーアップデートとして予定され
ている規格
ただし、2017年に策定されると決まっているわ
けではない
以前はC++1yと呼ばれていた

29
2013年12月7日土曜日
C++17までのプロセス
✤

C++14とその後に続く言語仕様の策定作業と並
行して、TS(Technical Specification)と呼ばれる、特定の
機能に話題を絞ったドキュメントを作成
✤

Filesystem TS

✤

Ne...
例)Filesystem TS

✤

Boost.Filesystemを元に設計
✤

http://www.open-std.org/jtc1/sc22/wg21/docs/
papers/2013/n3803.pdf

31
2013年1...
namespace	 fs	 =	 boost::filesystem;
int	 main()
{
	 	 	 	 const	 fs::path	 path("dir1/a.txt");	 //	 コピー元
	 	 	 	 const	 f...
例)Parallelism TS

✤

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

33
2013年12月7日土曜日
std::vector<int>	 vec	 =	 ...
//	 これまで通りの、シーケンシャルソート
std::sort(vec.begin(),	 vec.end());
//	 明示的なシーケンシャルソート
std::sort(std:...
C++17

✤

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

35
2013年12月7日土曜日
ロードマップ

http://isocpp.org/std/status

36
2013年12月7日土曜日
Upcoming SlideShare
Loading in …5
×

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

3,559 views

Published on

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

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,559
On SlideShare
0
From Embeds
0
Number of Embeds
2,166
Actions
Shares
0
Downloads
11
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

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

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

×