0
12013/06/22 CryoliteBoost.勉強会 #12 ⼤阪Allocators@C++11
22013/06/22 CryoliteBoost.勉強会 #12 ⼤阪Allocators@C++03
Q. アロケータとは何か?A. メモリ割り当てをカスタマイズする仕掛け3
Q. アロケータとは何か?A. メモリ割り当てをカスタマイズする仕掛け4
アロケータのメンバって(de)?allocate だけですか?5• pointer – 割り当てたメモリを指すポインタ型• allocate – メモリを割り当てる• deallocate – メモリを開放する• construct – オブジ...
アロケータのメンバって(de)?allocate だけですか?6• pointer – 割り当てたメモリを指すポインタ型• allocate – メモリを割り当てる• deallocate – メモリを開放する• construct – オブジ...
今⽇⾔いに来たこと7(de)?allocate をカスタマイズしたら終わり,というそのふざけた幻想※をぶち壊しにきました.※インターネッツを利⽤した当社独⾃の調査による
C++03 のアロケータはあんまり使えない8
C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない9
C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない10
C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない11
C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメン...
なぜオブジェクト毎の状態を持てないような制限が C++03 のアロケータに対してあるのか?重要な制約あるアロケータの値で allocateされたメモリは,同じアロケータの値で deallocate しないといけない.13
アロケータとコンテナの swap の関係14pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ ...
15pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>swapアロケータとコンテナの swap の関係
16pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ は各々の p_ が指している領域について...
17pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ は各々の p_ が指している領域について...
18pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>じゃあアロケータもswap すれば良いじゃん?アロケー...
19template<typename T, size_t N>class StackAllocator {.....char storage_[N];};ところが swap できないアロケータの種類があるここからメモリを割り当てるこの型のアロ...
Q. 状態を持ったアロケータとswap の問題どうすんの?A. (in C++03) 実装依存です≒規格がほとんど何も⾔ってないので,アロケータはオブジェクト毎の状態を持てないと仮定するしかない.20
Allocators@C++03 について街の⼈の声を聞いてきました21
22Allocators@C++03 について街の⼈の声を聞いてきました
23使いどころが限定されるが使えないわけじゃないAllocators@C++03 について街の⼈の声を聞いてきました
24使いどころが限定されるが使えないわけじゃない良く分かってそうな感じAllocators@C++03 について街の⼈の声を聞いてきました
25Allocators@C++03 について街の⼈の声を聞いてきました
26Allocators@C++03 について街の⼈の声を聞いてきました
27Allocators@C++03 について街の⼈の声を聞いてきましたオブジェクト毎に情報持てなくてもそんなに深刻じゃないよ
28深刻だろ,常識的に考えて…Allocators@C++03 について街の⼈の声を聞いてきましたオブジェクト毎に情報持てなくてもそんなに深刻じゃないよ
29Allocators@C++03 について専⾨家の話を聞いてきました
30Allocators@C++03 について専⾨家の話を聞いてきましたPablo Halpern(アロケータ補完計画メンバ)
31Allocators@C++03 について専⾨家の話を聞いてきましたPablo Halpern(アロケータ補完計画メンバ)標準化委員の誰かが「単に間に合わなかっただけ」ってゆってた
Allocators@C++03 まとめ32
Allocators@C++03 まとめ33規格の⽂⾔を書くのが間に合いませんでした
342013/06/22 CryoliteBoost.勉強会 #12 大阪Allocators@C++11
規格の⽂⾔ができました35
C++11 のアロケータでは何が起きたか?36
アロケータに対する異次元(?)の制限緩和37
アロケートノミクスのカスタマイズ戦略3本の⽮38状態を持つアロケータStateful allocatorスコープドアロケータモデルScoped allocator modelアロケータへの配慮Allocator-awareness
制限緩和+3本の矢=アロケータ株価の上昇39右肩上がり!本発表終了時イマココ!
制限緩和+3本の矢=アロケータ株価の上昇40本発表終了時イマココ!
Allocator-awarenessアロケータへの配慮41
Allocator-awarenessアロケータへの配慮ユーザから指定されたアロケータをちゃんと使います.42
アロケータへの配慮std::vector の例 (1/2)43pointer p_;.....MyClass MyClass MyClass ・・・・・(未構築)std::vector<MyClass>メモリは allocate で獲得,dea...
44pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>コンテナの swap のときにアロケータをswap す...
45pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>アロケータへの配慮std::vector の例 (2/...
アロケータへの配慮std::list の例46pointer head_;.....MyClass v_;pointer next_;.....std::list<MyClass>_ListNodeMyClass v_;pointer next...
状態を持つアロケータStateful Allocator47
状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!48
状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます!49
状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます! 50
C++11 のアロケータで何ができるか?51
allocate/deallocate で⾃作汎⽤メモリアロケータ……?52
allocate/deallocate で⾃作汎⽤メモリアロケータ……?malloc@glibc「ほう? 汎⽤メモリアロケータを⾃作……ですか.」jemalloc「我々を超えてみせる,と?」tcmalloc「これは楽しみですなぁククク…….」53
allocate/deallocate で⾃作汎⽤メモリアロケータ……?malloc@glibc「ほう? 汎⽤メモリアロケータを⾃作……ですか.」jemalloc「我々を超えてみせる,と?」tcmalloc「これは楽しみですなぁククク…….」5...
55超単純なアロケータ実装以外ではほとんど意味なかった←結論allocate/deallocate で⾃作汎⽤メモリアロケータの前に
ここから初級の話その156
(de)?allocate をカスタマイズしてメモリっぽいものを扱う57
(de)?allocate をカスタマイズしてメモリっぽいものを扱う58仮想ページ仮想アドレス空間mmapnewshm_open& mmap
(de)?allocate をカスタマイズしてメモリっぽいものを扱う59仮想ページ仮想アドレス空間mmapnewshm_open& mmapもしかして:Boost.Interprocessのアロケータ
(de)?allocate をカスタマイズしてメモリっぽいものを扱う60仮想ページ仮想アドレス空間mmapnewshm_open& mmapもしかして:Boost.InterprocessのアロケータBoost.Interprocess のアロ...
ここから初級の話その261
62•メモリ使⽤総量,オブジェクト総数のカウント•デバッグ⽤各種フック•各イベントをBoost.Signals2 で発⾏•その他allocate/deallocate,construct/destroy にフックを仕掛ける
allocate/deallocate,construct/destroy にフックを仕掛ける63•メモリ使⽤総量,オブジェクト総数のカウント•デバッグ⽤各種フック•各イベントをBoost.Signals2 で発⾏•その他
ここから中級の話その164
pointer 型をスマートポインタとしてカスタマイズ65
pointer 型をスマートポインタとしてカスタマイズ66Q. アロケータを使う側がallocate/construct に対応する deallocate/destroy をちゃんと呼び出すはずだから,スマートポインタにする必要ないのでは?
67int main(){vector<int> v(a);f(move(v));.....}void f(vector v){..........}a.exe (デバッグビルド) b.dll (リリースビルド)デバッグビルドの new で獲得...
pointer 型をスマートポインタとしてカスタマイズ68template<typename T>struct RobustAlloc {typedef std::shared_ptr<T> pointer;.....pointer alloc...
69int main(){RobustAlloc a;vector<int, RobustAlloc> v(a);f(move(v));.....}void f(vector v){..........}a.exe (デバッグビルド) b.dl...
ここから中級の話その1.570
construct/destroy でコンテナ要素の⽣成をハック71vector<string> v;v.emplace(“Hello”);呼ばれるコンストラクタはstring(“Hello”)
construct/destroy でコンテナ要素の⽣成をハック72template<typename T>struct MyAlloc {template<typenmae... Args>void construct(T *p, Args ...
construct/destroy でコンテナ要素の⽣成をハック73template<typename T>struct MyAlloc {template<typenmae... Args>void construct(T *p, Args ...
construct/destroy でコンテナ要素の⽣成をハック74vector<string, MyAlloc> v;v.emplace(“Hello”);実際に呼ばれるコンストラクタはstring(“Hello”, a_)
construct/destroy でコンテナ要素の⽣成をハック75vector<string, MyAlloc> v;v.emplace(“Hello”);実際に呼ばれるコンストラクタはstring(“Hello”, a_)アロケータはコンテ...
ここから中級の話その276
77Template<typename T>class IndirectPointer {T **p_;.....T &operator*() { return **p_; }};Template<typename T>class Indire...
78Template<typename T>IndirectAlloc<T>::allocate;sizeof(T) * n バイトではなくsizeof(T *) * n バイトを確保アロケータカスタマイズによる ptr_containers
79Template<typename T>IndirectAlloc<T>::allocate;Template<typename T>IndirectAlloc<T>::construct;sizeof(T) * n バイトではなくsize...
80vector<int, IndirectAlloc<int> > v;// boost::ptr_vector<int> 相当list<int, IndirectAlloc<int> > l;// boost::ptr_list<int> ...
アロケータカスタマイズによる ptr_containers81vector<int, IndirectAlloc<int> > v;// boost::ptr_vector<int> 相当list<int, IndirectAlloc<int>...
ここから上級の話Scoped Allocator Model82
vector<string> v;83vector<string> に string を追加し続ける例
プログラム中のいろんな場所から参照され,要素が追加されると仮定vector<string> v;84v.emplace_back(“hoge”);v.emplace_back(“fuga”);vector<string> に string を追...
vector の部分はメモリの再割り当てが必要だが, string の部分は超単純な割り当て戦略でよい.vector<string> v;85vector<string> に string を追加し続ける例
86(外側のアロケータ)デフォルトのアロケータとして振る舞う(内側のアロケータ)単純なアロケータ(リージョン・アリーナ)として振る舞うネストされたアロケータvector<string> に string を追加し続ける例
87(外側のアロケータ)デフォルトのアロケータとして振る舞うconstruct で内側のアロケータを引数に追加(内側のアロケータ)単純なアロケータ(リージョン・アリーナ)として振る舞うNestedAllocatorvector<string> ...
vector<string> に string を追加し続ける例88vector<string, NestedAlloc<string> > v;v.emplace_back(“hoge”);v.emplace_back(“fuga”);vst...
今⽇⾔いに来たこと(再掲)89アロケータは(de)?allocate をカスタマイズしたら終わりではありません.
allocate/deallocate をカスタマイズする前に90超単純なアロケータ実装以外ではほとんど意味なかった←結論
超単純なアロケータとは?Region/Arena Allocator91メモリをドバっと確保して
92先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
93先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
94先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
これからのアロケータ95
アロケータのカスタマイズによる最⼤の弊害96アロケータのカスタマイズ=型を変える=オブジェクト同⼠の相互運⽤性低下
型消去による動的多相アロケータ – polymorphic_allocator97アロケータのカスタマイズしつつ,型を消去してオブジェクト同⼠の相互運⽤性を維持する
polymorphic_allocator まとめ98規格の⽂⾔を書くのが間に合いませんでした
polymorphic_allocator まとめ99規格の⽂⾔を書くのが間に合いませんでした
100201z/xx/yy CryoliteBoost.勉強会 #n 大阪Allocators@C++14coming soon...1z
Upcoming SlideShare
Loading in...5
×

Allocators@C++11

2,889

Published on

2013/06/22 Boost.勉強会 #12 大阪

発表時のままの版.

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

No Downloads
Views
Total Views
2,889
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
16
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Transcript of "Allocators@C++11"

  1. 1. 12013/06/22 CryoliteBoost.勉強会 #12 ⼤阪Allocators@C++11
  2. 2. 22013/06/22 CryoliteBoost.勉強会 #12 ⼤阪Allocators@C++03
  3. 3. Q. アロケータとは何か?A. メモリ割り当てをカスタマイズする仕掛け3
  4. 4. Q. アロケータとは何か?A. メモリ割り当てをカスタマイズする仕掛け4
  5. 5. アロケータのメンバって(de)?allocate だけですか?5• pointer – 割り当てたメモリを指すポインタ型• allocate – メモリを割り当てる• deallocate – メモリを開放する• construct – オブジェクトを構築する• destroy – オブジェクトを破壊する• .....
  6. 6. アロケータのメンバって(de)?allocate だけですか?6• pointer – 割り当てたメモリを指すポインタ型• allocate – メモリを割り当てる• deallocate – メモリを開放する• construct – オブジェクトを構築する• destroy – オブジェクトを破壊する• .....メモリの割り当て・解放以外もできる!
  7. 7. 今⽇⾔いに来たこと7(de)?allocate をカスタマイズしたら終わり,というそのふざけた幻想※をぶち壊しにきました.※インターネッツを利⽤した当社独⾃の調査による
  8. 8. C++03 のアロケータはあんまり使えない8
  9. 9. C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない9
  10. 10. C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない10
  11. 11. C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない11
  12. 12. C++03 のアロケータはあんまり使えないあんまり使えない理由:• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない• オブジェクト毎の状態を持てない≒⾮静的データメンバを持てない12
  13. 13. なぜオブジェクト毎の状態を持てないような制限が C++03 のアロケータに対してあるのか?重要な制約あるアロケータの値で allocateされたメモリは,同じアロケータの値で deallocate しないといけない.13
  14. 14. アロケータとコンテナの swap の関係14pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ は各々の p_ が指している領域を解放できる
  15. 15. 15pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>swapアロケータとコンテナの swap の関係
  16. 16. 16pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ は各々の p_ が指している領域について知らないswapアロケータとコンテナの swap の関係
  17. 17. 17pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>各々の a_ は各々の p_ が指している領域について知らないswapアロケータとコンテナの swap の関係
  18. 18. 18pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>じゃあアロケータもswap すれば良いじゃん?アロケータとコンテナの swap の関係swap
  19. 19. 19template<typename T, size_t N>class StackAllocator {.....char storage_[N];};ところが swap できないアロケータの種類があるここからメモリを割り当てるこの型のアロケータ同⼠はswap できない
  20. 20. Q. 状態を持ったアロケータとswap の問題どうすんの?A. (in C++03) 実装依存です≒規格がほとんど何も⾔ってないので,アロケータはオブジェクト毎の状態を持てないと仮定するしかない.20
  21. 21. Allocators@C++03 について街の⼈の声を聞いてきました21
  22. 22. 22Allocators@C++03 について街の⼈の声を聞いてきました
  23. 23. 23使いどころが限定されるが使えないわけじゃないAllocators@C++03 について街の⼈の声を聞いてきました
  24. 24. 24使いどころが限定されるが使えないわけじゃない良く分かってそうな感じAllocators@C++03 について街の⼈の声を聞いてきました
  25. 25. 25Allocators@C++03 について街の⼈の声を聞いてきました
  26. 26. 26Allocators@C++03 について街の⼈の声を聞いてきました
  27. 27. 27Allocators@C++03 について街の⼈の声を聞いてきましたオブジェクト毎に情報持てなくてもそんなに深刻じゃないよ
  28. 28. 28深刻だろ,常識的に考えて…Allocators@C++03 について街の⼈の声を聞いてきましたオブジェクト毎に情報持てなくてもそんなに深刻じゃないよ
  29. 29. 29Allocators@C++03 について専⾨家の話を聞いてきました
  30. 30. 30Allocators@C++03 について専⾨家の話を聞いてきましたPablo Halpern(アロケータ補完計画メンバ)
  31. 31. 31Allocators@C++03 について専⾨家の話を聞いてきましたPablo Halpern(アロケータ補完計画メンバ)標準化委員の誰かが「単に間に合わなかっただけ」ってゆってた
  32. 32. Allocators@C++03 まとめ32
  33. 33. Allocators@C++03 まとめ33規格の⽂⾔を書くのが間に合いませんでした
  34. 34. 342013/06/22 CryoliteBoost.勉強会 #12 大阪Allocators@C++11
  35. 35. 規格の⽂⾔ができました35
  36. 36. C++11 のアロケータでは何が起きたか?36
  37. 37. アロケータに対する異次元(?)の制限緩和37
  38. 38. アロケートノミクスのカスタマイズ戦略3本の⽮38状態を持つアロケータStateful allocatorスコープドアロケータモデルScoped allocator modelアロケータへの配慮Allocator-awareness
  39. 39. 制限緩和+3本の矢=アロケータ株価の上昇39右肩上がり!本発表終了時イマココ!
  40. 40. 制限緩和+3本の矢=アロケータ株価の上昇40本発表終了時イマココ!
  41. 41. Allocator-awarenessアロケータへの配慮41
  42. 42. Allocator-awarenessアロケータへの配慮ユーザから指定されたアロケータをちゃんと使います.42
  43. 43. アロケータへの配慮std::vector の例 (1/2)43pointer p_;.....MyClass MyClass MyClass ・・・・・(未構築)std::vector<MyClass>メモリは allocate で獲得,deallocate で解放各 value_type オブジェクトはconstruct で構築, destroy で破壊ポインタ型はアロケータで指定されたものを使う
  44. 44. 44pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>コンテナの swap のときにアロケータをswap する・しない,を制御可アロケータへの配慮std::vector の例 (2/2)(propagate_on_container_*)
  45. 45. 45pointer p_;allocator_type a_;.....pointer p_;allocator_type a_;.....vector<Hoge> vector<Hoge>アロケータへの配慮std::vector の例 (2/2)コンテナの swap のときにアロケータをswap する・しない,を制御可(propagate_on_container_*)
  46. 46. アロケータへの配慮std::list の例46pointer head_;.....MyClass v_;pointer next_;.....std::list<MyClass>_ListNodeMyClass v_;pointer next_;....._ListNode・・・・・
  47. 47. 状態を持つアロケータStateful Allocator47
  48. 48. 状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!48
  49. 49. 状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます!49
  50. 50. 状態を持つアロケータStateful Allocatorアロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます!アロケータがオブジェクト毎の状態を持てます! 50
  51. 51. C++11 のアロケータで何ができるか?51
  52. 52. allocate/deallocate で⾃作汎⽤メモリアロケータ……?52
  53. 53. allocate/deallocate で⾃作汎⽤メモリアロケータ……?malloc@glibc「ほう? 汎⽤メモリアロケータを⾃作……ですか.」jemalloc「我々を超えてみせる,と?」tcmalloc「これは楽しみですなぁククク…….」53
  54. 54. allocate/deallocate で⾃作汎⽤メモリアロケータ……?malloc@glibc「ほう? 汎⽤メモリアロケータを⾃作……ですか.」jemalloc「我々を超えてみせる,と?」tcmalloc「これは楽しみですなぁククク…….」54死にたくないのでスキップします
  55. 55. 55超単純なアロケータ実装以外ではほとんど意味なかった←結論allocate/deallocate で⾃作汎⽤メモリアロケータの前に
  56. 56. ここから初級の話その156
  57. 57. (de)?allocate をカスタマイズしてメモリっぽいものを扱う57
  58. 58. (de)?allocate をカスタマイズしてメモリっぽいものを扱う58仮想ページ仮想アドレス空間mmapnewshm_open& mmap
  59. 59. (de)?allocate をカスタマイズしてメモリっぽいものを扱う59仮想ページ仮想アドレス空間mmapnewshm_open& mmapもしかして:Boost.Interprocessのアロケータ
  60. 60. (de)?allocate をカスタマイズしてメモリっぽいものを扱う60仮想ページ仮想アドレス空間mmapnewshm_open& mmapもしかして:Boost.InterprocessのアロケータBoost.Interprocess のアロケータは statefulですが, 標準のコンテナに乗せられます.
  61. 61. ここから初級の話その261
  62. 62. 62•メモリ使⽤総量,オブジェクト総数のカウント•デバッグ⽤各種フック•各イベントをBoost.Signals2 で発⾏•その他allocate/deallocate,construct/destroy にフックを仕掛ける
  63. 63. allocate/deallocate,construct/destroy にフックを仕掛ける63•メモリ使⽤総量,オブジェクト総数のカウント•デバッグ⽤各種フック•各イベントをBoost.Signals2 で発⾏•その他
  64. 64. ここから中級の話その164
  65. 65. pointer 型をスマートポインタとしてカスタマイズ65
  66. 66. pointer 型をスマートポインタとしてカスタマイズ66Q. アロケータを使う側がallocate/construct に対応する deallocate/destroy をちゃんと呼び出すはずだから,スマートポインタにする必要ないのでは?
  67. 67. 67int main(){vector<int> v(a);f(move(v));.....}void f(vector v){..........}a.exe (デバッグビルド) b.dll (リリースビルド)デバッグビルドの new で獲得したメモリをリリースビルドの delete で解放><;new/delete のABI ⾮互換性の克服
  68. 68. pointer 型をスマートポインタとしてカスタマイズ68template<typename T>struct RobustAlloc {typedef std::shared_ptr<T> pointer;.....pointer allocate(size_t n){return pointer(new char[n * sizeof(T)],[](void *p) { delete p[]; });}void deallocate(pointer p, size_type n){ /* do nothing */ }};
  69. 69. 69int main(){RobustAlloc a;vector<int, RobustAlloc> v(a);f(move(v));.....}void f(vector v){..........}a.exe (デバッグビルド) b.dll (リリースビルド)new/delete のABI ⾮互換性の克服デバッグビルドの new でメモリを獲得,デバッグビルドの delete で解放するのでO.K.(詳しくは 私の第1回 Boost.勉強会参照)
  70. 70. ここから中級の話その1.570
  71. 71. construct/destroy でコンテナ要素の⽣成をハック71vector<string> v;v.emplace(“Hello”);呼ばれるコンストラクタはstring(“Hello”)
  72. 72. construct/destroy でコンテナ要素の⽣成をハック72template<typename T>struct MyAlloc {template<typenmae... Args>void construct(T *p, Args &&... args) {::new ((void *)p)(std::forward<Args>(args)...,AnotherAlloc a_);}.....AnotherAlloc a_;};
  73. 73. construct/destroy でコンテナ要素の⽣成をハック73template<typename T>struct MyAlloc {template<typenmae... Args>void construct(T *p, Args &&... args) {::new ((void *)p)(std::forward<Args>(args)...,AnotherAlloc a_);}.....AnotherAlloc a_;};元々のコンストラクタの引数にa_ を付け加えてコンストラクタを呼び出し
  74. 74. construct/destroy でコンテナ要素の⽣成をハック74vector<string, MyAlloc> v;v.emplace(“Hello”);実際に呼ばれるコンストラクタはstring(“Hello”, a_)
  75. 75. construct/destroy でコンテナ要素の⽣成をハック75vector<string, MyAlloc> v;v.emplace(“Hello”);実際に呼ばれるコンストラクタはstring(“Hello”, a_)アロケータはコンテナ要素の構築⽅法を完全に乗っ取ることが可能.
  76. 76. ここから中級の話その276
  77. 77. 77Template<typename T>class IndirectPointer {T **p_;.....T &operator*() { return **p_; }};Template<typename T>class IndirectAlloc;アロケータカスタマイズによる ptr_containers
  78. 78. 78Template<typename T>IndirectAlloc<T>::allocate;sizeof(T) * n バイトではなくsizeof(T *) * n バイトを確保アロケータカスタマイズによる ptr_containers
  79. 79. 79Template<typename T>IndirectAlloc<T>::allocate;Template<typename T>IndirectAlloc<T>::construct;sizeof(T) * n バイトではなくsizeof(T *) * n バイトを確保(T 型のオブジェクト)アロケータカスタマイズによる ptr_containers
  80. 80. 80vector<int, IndirectAlloc<int> > v;// boost::ptr_vector<int> 相当list<int, IndirectAlloc<int> > l;// boost::ptr_list<int> 相当アロケータカスタマイズによる ptr_containers
  81. 81. アロケータカスタマイズによる ptr_containers81vector<int, IndirectAlloc<int> > v;// boost::ptr_vector<int> 相当list<int, IndirectAlloc<int> > l;// boost::ptr_list<int> 相当さらにアロケータの construct を加工して, factory に転送して動的多相な形でコンテナの要素を乗せることが可能.
  82. 82. ここから上級の話Scoped Allocator Model82
  83. 83. vector<string> v;83vector<string> に string を追加し続ける例
  84. 84. プログラム中のいろんな場所から参照され,要素が追加されると仮定vector<string> v;84v.emplace_back(“hoge”);v.emplace_back(“fuga”);vector<string> に string を追加し続ける例
  85. 85. vector の部分はメモリの再割り当てが必要だが, string の部分は超単純な割り当て戦略でよい.vector<string> v;85vector<string> に string を追加し続ける例
  86. 86. 86(外側のアロケータ)デフォルトのアロケータとして振る舞う(内側のアロケータ)単純なアロケータ(リージョン・アリーナ)として振る舞うネストされたアロケータvector<string> に string を追加し続ける例
  87. 87. 87(外側のアロケータ)デフォルトのアロケータとして振る舞うconstruct で内側のアロケータを引数に追加(内側のアロケータ)単純なアロケータ(リージョン・アリーナ)として振る舞うNestedAllocatorvector<string> に string を追加し続ける例
  88. 88. vector<string> に string を追加し続ける例88vector<string, NestedAlloc<string> > v;v.emplace_back(“hoge”);v.emplace_back(“fuga”);vstring “hoge”“fuga”・・・string・・・外側のアロケータのメモリリソース内側のアロケータのメモリリソース
  89. 89. 今⽇⾔いに来たこと(再掲)89アロケータは(de)?allocate をカスタマイズしたら終わりではありません.
  90. 90. allocate/deallocate をカスタマイズする前に90超単純なアロケータ実装以外ではほとんど意味なかった←結論
  91. 91. 超単純なアロケータとは?Region/Arena Allocator91メモリをドバっと確保して
  92. 92. 92先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
  93. 93. 93先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
  94. 94. 94先頭から順に確保超単純なアロケータとは?Region/Arena Allocator
  95. 95. これからのアロケータ95
  96. 96. アロケータのカスタマイズによる最⼤の弊害96アロケータのカスタマイズ=型を変える=オブジェクト同⼠の相互運⽤性低下
  97. 97. 型消去による動的多相アロケータ – polymorphic_allocator97アロケータのカスタマイズしつつ,型を消去してオブジェクト同⼠の相互運⽤性を維持する
  98. 98. polymorphic_allocator まとめ98規格の⽂⾔を書くのが間に合いませんでした
  99. 99. polymorphic_allocator まとめ99規格の⽂⾔を書くのが間に合いませんでした
  100. 100. 100201z/xx/yy CryoliteBoost.勉強会 #n 大阪Allocators@C++14coming soon...1z
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×