Enviar búsqueda
Cargar
Effective Modern C++ 勉強会 Item26
•
0 recomendaciones
•
1,213 vistas
A
Akihiro Nishimura
Seguir
Ingeniería
Denunciar
Compartir
Denunciar
Compartir
1 de 18
Descargar ahora
Descargar para leer sin conexión
Recomendados
Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27
Mitsuru Kariya
Effective modern c++ 5
Effective modern c++ 5
uchan_nos
Effective modern c++ 8
Effective modern c++ 8
uchan_nos
Emcpp0506
Emcpp0506
Takatoshi Kondo
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
Recomendados
Effective Modern C++ 勉強会#7 Item 27
Effective Modern C++ 勉強会#7 Item 27
Mitsuru Kariya
Effective modern c++ 5
Effective modern c++ 5
uchan_nos
Effective modern c++ 8
Effective modern c++ 8
uchan_nos
Emcpp0506
Emcpp0506
Takatoshi Kondo
emc++ chapter32
emc++ chapter32
Tatsuki SHIMIZU
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
maruyama097
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装
Ryoma Sin'ya
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
MITSUNARI Shigeo
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Fixstars Corporation
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
Effective modern-c++#9
Effective modern-c++#9
Tatsuki SHIMIZU
Más contenido relacionado
La actualidad más candente
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
maruyama097
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装
Ryoma Sin'ya
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Masahito Zembutsu
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
MITSUNARI Shigeo
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Fixstars Corporation
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
La actualidad más candente
(20)
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
Lockfree Queue
Lockfree Queue
プログラムを高速化する話
プログラムを高速化する話
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
関数プログラミング入門
関数プログラミング入門
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
世界最速の正規表現JITエンジンの実装
世界最速の正規表現JITエンジンの実装
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
Glibc malloc internal
Glibc malloc internal
Destacado
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
Effective modern-c++#9
Effective modern-c++#9
Tatsuki SHIMIZU
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39
Takatoshi Kondo
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)
Keisuke Fukuda
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25
Takashi Hoshino
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38
Takashi Hoshino
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
mooopan
Overview of the .Net Collection Framework and Immutable Collections
Overview of the .Net Collection Framework and Immutable Collections
Yoshifumi Kawai
Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
emcjp Item 42
emcjp Item 42
MITSUNARI Shigeo
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
Emcpp item31
Emcpp item31
mitsutaka_takeda
Emcpp item41
Emcpp item41
mitsutaka_takeda
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
Ryo Igarashi
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
Destacado
(16)
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Effective modern-c++#9
Effective modern-c++#9
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ study group Item39
Effective Modern C++ study group Item39
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++勉強会#2 Item 11(,12)
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#6 Item25
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ 勉強会#8 Item38
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Effective Modern C++ Item 24: Distinguish universal references from rvalue re...
Overview of the .Net Collection Framework and Immutable Collections
Overview of the .Net Collection Framework and Immutable Collections
Emcjp item33,34
Emcjp item33,34
emcjp Item 42
emcjp Item 42
Emcjp item21
Emcjp item21
Emcpp item31
Emcpp item31
Emcpp item41
Emcpp item41
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Similar a Effective Modern C++ 勉強会 Item26
What is template
What is template
Akira Takahashi
研究生のためのC++ no.2
研究生のためのC++ no.2
Tomohiro Namba
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
yo0824
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
C#coding guideline その2_20130325
C#coding guideline その2_20130325
Yoshihisa Ozaki
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
Shuyo Nakatani
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
Functional Programming in Swift
Functional Programming in Swift
Kaz Yoshikawa
安全なプログラムの作り方
安全なプログラムの作り方
Kazuhiro Nishiyama
Tr18015
Tr18015
kikairoya
Python勉強会1-はじめに
Python勉強会1-はじめに
理 小林
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
A Machine Learning Framework for Programming by Example
A Machine Learning Framework for Programming by Example
Koji Matsuda
Tdd
Tdd
Takaya Kotohata
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
関数プログラミング入門
関数プログラミング入門
masatora atarashi
Web本文抽出 using crf
Web本文抽出 using crf
Shuyo Nakatani
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
Polyphony の並列化
Polyphony の並列化
ryos36
使い捨て python コードの書き方
使い捨て python コードの書き方
Sho Shimauchi
Similar a Effective Modern C++ 勉強会 Item26
(20)
What is template
What is template
研究生のためのC++ no.2
研究生のためのC++ no.2
Java8 lambdas chapter1_2
Java8 lambdas chapter1_2
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
C#coding guideline その2_20130325
C#coding guideline その2_20130325
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
JavaScript 講習会 #1
JavaScript 講習会 #1
Functional Programming in Swift
Functional Programming in Swift
安全なプログラムの作り方
安全なプログラムの作り方
Tr18015
Tr18015
Python勉強会1-はじめに
Python勉強会1-はじめに
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
A Machine Learning Framework for Programming by Example
A Machine Learning Framework for Programming by Example
Tdd
Tdd
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
関数プログラミング入門
関数プログラミング入門
Web本文抽出 using crf
Web本文抽出 using crf
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Polyphony の並列化
Polyphony の並列化
使い捨て python コードの書き方
使い捨て python コードの書き方
Effective Modern C++ 勉強会 Item26
1.
Universal Referenceの オーバーロードは避けよう 2015/06/17 EMC++勉強会 西村
章宏 @Regenschauer490
2.
概要 • 汎用的で効率面で無駄のない関数を実現するには、 universal referenceが便利 •
後から特殊化された処理を加えようとして、関数 オーバーロードを行うと思わぬ落とし穴 • Perfect forwarding なコンストラクタが基底クラスに ある場合、継承時に思わぬ落とし穴
3.
例:フリー関数 • 引数に文字列を渡したい場合 – 名前を引数に取り、ログを追加する関数を考える •
単純に考えると、次の様な関数が思い浮かぶ • このコードは悪くはないが、効率的ではない std::multiset<std::string> names; void logAndAdd( const std::string& name) { … names.emplace(name); }
4.
例:フリー関数 – 呼び出し側で渡される文字列の型は3種類考えられる 1. lvalue
std::string 2. rvalue std::string 3. 文字列リテラル std::string petName(“Darla”); logAndAdd( petName ); // 1 logAndAdd( std::string(“Persephone”) ); // 2 logAndAdd( “Patty Dog” ); // 3
5.
例:フリー関数 – ログ(names)に渡されるまでの過程 1. lvalue
std::string ① petNameを作成 ② nameをpetNameにバインド (非コピー) ③ namesにnameが渡され、内部でコピー std::string petName(“Darla”); logAndAdd( petName ); void logAndAdd( const std::string& name) { … names.emplace(name); }
6.
例:フリー関数 – ログ(names)に渡されるまでの過程 2. rvalue
std::string ① 一時的なstd::stringを作成 ② nameを一時変数にバインド (非コピー) ③ namesにnameが渡され、内部でコピーされる name自体はlvalueなのでmoveされない logAndAdd( std::string(“Persephone”) ); void logAndAdd( const std::string& name) { … names.emplace(name); }
7.
例:フリー関数 – ログ(names)に渡されるまでの過程 3. 文字列リテラル ①
nameを”Pretty Dog”にバインドする際、暗黙的に 一時的なstd::stringを作成 ② namesにnameが渡され、内部でコピーされる name自体はlvalueなのでmoveされない logAndAdd( “Patty Dog” ); void logAndAdd( const std::string& name) { … names.emplace(name); }
8.
例:フリー関数 – logAndAdd関数の効率面での問題点 1. lvalue
std::string : 特になし 2. rvalue std::string : moveできるのにコピーされている 3. 文字列リテラル : emplaceに文字列リテラルをそのまま 渡せるのに一時変数が作られ、それが コピーされている std::string petName(“Darla”); logAndAdd( petName ); logAndAdd( std::string(“Persephone”) ); logAndAdd( “Patty Dog” ); void logAndAdd( const std::string& name) { … names.emplace(name); }
9.
例:フリー関数 – universal referenceを使えば解決できるかも! 1.
lvalue std::string : 変更前と同じ (T&& -> std::string&) 2. rvalue std::string : perfect forwarding (T -> std::string) 3. 文字列リテラル : 文字列リテラルのままemplaceに渡さ れる (T&& -> const char (&)[10] ) std::string petName(“Darla”); logAndAdd( petName ); logAndAdd( std::string(“Persephone”) ); logAndAdd( “Patty Dog” ); template <typename T> void logAndAdd( T&& name) { … names.emplace(std::forward<T>(name)); }
10.
Universal Referenceで解決 – 解決ゥ!
第26章完! – …もし別の型でログを追加する必要が生じた場合 • indexを引数に取り、対応する名前を検索してログを追加する 関数を想定 • int型を引数に取るオーバーロードを定義 void logAndAdd(int idx) { … names.emplace( nameFromIndex(idx) ); }
11.
Universal Referenceとオーバーロード – 意図通りのオーバーロード解決にはならない •
short型変数からは、T&&の関数が呼び出されてしまう • T&&の関数内で、emplaceはshort型に対するオーバー ロードは存在しないのでエラーとなる std::string petName(“Darla”); short nameIdx; logAndAdd( petName ); // invoke T&& overload logAndAdd( std::string(“Persephone”) ); // invoke T&& overload logAndAdd( “Patty Dog” ); // invoke T&& overload logAndAdd( 22 ); // call int overload logAndAdd( nameIdx ); // error!
12.
オーバーロード解決 • 原則として、引数が最もマッチする関数が選択される 大まかな優先順位は以下の通り 1.
非関数templateで、引数が最もマッチする関数 2. 関数templateで、template argument deductionにより 1と同じシグネチャになる関数 3. 暗黙的変換を行うとマッチする関数 (変換の種類の中にも3段階の優先順位あり)
13.
オーバーロード解決 – 例 void f(short
v); // 優先順位1 (非template, 無変換) template <class T> void f(T& v); // 優先順位2 (template, 無変換) void f(short const& a); // 優先順位3 (非template, qualification conversion) template <class T> void f(T const& v); // 優先順位4 (template, qualification conversion) void f(int v); // 優先順位5 (非template , integral promotion) void f(double v); // 優先順位6 (非template, floating-integral conversion) int main(){ short a = 1; f(a); }
14.
例:コンストラクタ • logAndAdd関数に似た機能をコンストラクタで実装したい – perfect
forwarding なコンストラクタを考える • 一見、コンストラクタは2種類しか存在しないように見える • templateコンストラクタは、コピー・ムーブコンストラクタの 自動生成の妨げとはならない class Person { template<typename T> explicit Person( T&& name ); explicit Person( int idx ); }
15.
例:コンストラクタ – perfect forwarding
なコンストラクタを考える • コピー・ムーブコンストラクタが自動生成される • 下記4種類の中からオーバーロード解決が行われる class Person { template<typename T> explicit Person( T&& name ); explicit Person( int idx ); Person( const Person& rhs ); Person( Person&& rhs ); };
16.
例:コンストラクタ – フリー関数の場合と同様、意図通りには動かない • 下例ではコピーコンストラクタが呼ばれて欲しいが… •
この例では、T&& はインスタンス化されると Person& となる • pは非const修飾であるため、コピーコンストラクタのシグネ チャとマッチするためにはqualification conversionが必要 • よって、変換が不要なT&&の方が優先順位は高くなる Person p(“Nancy”); // invoke T&& ctor auto cloneOfp(p); // invoke T&& ctor ( not copy ctor ) ※const Person p(“Nancy”); と定義すると、copy ctorが呼ばれる
17.
例:コンストラクタ – 継承が絡んでくると更に酷いことに • rhsは
“SpecialPerson”型なので、PersonクラスのT&&は – copy ctor (上): T&& -> const SpecialPerson& – move ctor (下): T&& -> SpecialPerson&& • SpecialPerson& から Person& へは reference conversion が必要 class SpecialPerson : public Person { SpecialPerson( const SpecialPerson& rhs) : Person(rhs); // calls Person’s T&& ctor SpecialPerson( SpecialPerson&& rhs) : Person(std::move(rhs)); // calls Person’s T&& ctor };
18.
教訓 • Universal referenceはインスタンス化されると ほとんど全ての型(+修飾子)を表現できる Item24参照 例外はItem30で説明 •
オーバーロード解決では、 我々が予想する以上に universal referenceの方を呼び出されることが多い • Perfect forwarding なコンストラクタは特に問題があり、 もし基底クラスに存在すれば基底クラスのコピー・ムーブ コンストラクタを乗っ取ってしまう
Descargar ahora