Submit Search
Upload
Allocators@C++11
•
12 likes
•
7,589 views
C
Cryolite
Follow
2013/06/22 Boost.勉強会 #12 大阪 発表時のままの版.
Read less
Read more
Report
Share
Report
Share
1 of 100
Download now
Download to read offline
Recommended
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
Yoshifumi Kawai
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
Marp Tutorial
Marp Tutorial
Rui Watanabe
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
Recommended
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
モノビット エンジン
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
Yoshifumi Kawai
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
Marp Tutorial
Marp Tutorial
Rui Watanabe
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
MagicOnion入門
MagicOnion入門
torisoup
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
MQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
目grep入門 +解説
目grep入門 +解説
murachue
Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
こわくない Git
こわくない Git
Kota Saito
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方
Daisaku Mochizuki
IL2CPPに関する軽い話
IL2CPPに関する軽い話
Wooram Yang
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マルチコアを用いた画像処理
マルチコアを用いた画像処理
Norishige Fukushima
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
TaishiYamada1
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
GREE VR Studio Lab
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
左と右の話
左と右の話
Cryolite
Lambda in template_final
Lambda in template_final
Cryolite
More Related Content
What's hot
MagicOnion入門
MagicOnion入門
torisoup
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
Yoshiaki Sugimoto
MQTTとAMQPと.NET
MQTTとAMQPと.NET
terurou
目grep入門 +解説
目grep入門 +解説
murachue
Oss貢献超入門
Oss貢献超入門
Michihito Shigemura
TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
こわくない Git
こわくない Git
Kota Saito
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方
Daisaku Mochizuki
IL2CPPに関する軽い話
IL2CPPに関する軽い話
Wooram Yang
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
マルチコアを用いた画像処理
マルチコアを用いた画像処理
Norishige Fukushima
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
TaishiYamada1
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
GREE VR Studio Lab
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
What's hot
(20)
MagicOnion入門
MagicOnion入門
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
MQTTとAMQPと.NET
MQTTとAMQPと.NET
目grep入門 +解説
目grep入門 +解説
Oss貢献超入門
Oss貢献超入門
TLS, HTTP/2演習
TLS, HTTP/2演習
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
こわくない Git
こわくない Git
分散システムについて語らせてくれ
分散システムについて語らせてくれ
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
ゲームサーバ開発現場の考え方
ゲームサーバ開発現場の考え方
IL2CPPに関する軽い話
IL2CPPに関する軽い話
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
マルチコアを用いた画像処理
マルチコアを用いた画像処理
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
Docker Compose 徹底解説
Docker Compose 徹底解説
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
More from Cryolite
左と右の話
左と右の話
Cryolite
Lambda in template_final
Lambda in template_final
Cryolite
家に帰るまでが遠足です
家に帰るまでが遠足です
Cryolite
Destructive Call
Destructive Call
Cryolite
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
Cryolite
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
Cryolite
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
Cryolite
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Cryolite
More from Cryolite
(8)
左と右の話
左と右の話
Lambda in template_final
Lambda in template_final
家に帰るまでが遠足です
家に帰るまでが遠足です
Destructive Call
Destructive Call
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Allocators@C++11
1.
1 2013/06/22 Cryolite Boost.勉強会 #12
⼤阪 Allocators@C++11
2.
2 2013/06/22 Cryolite Boost.勉強会 #12
⼤阪 Allocators@C++03
3.
Q. アロケータとは何か? A. メモリ割り当てを カスタマイズする仕掛け 3
4.
Q. アロケータとは何か? A. メモリ割り当てを カスタマイズする仕掛け 4
5.
アロケータのメンバって (de)?allocate だけですか? 5 • pointer
– 割り当てたメモリを指すポ インタ型 • allocate – メモリを割り当てる • deallocate – メモリを開放する • construct – オブジェクトを構築する • destroy – オブジェクトを破壊する • .....
6.
アロケータのメンバって (de)?allocate だけですか? 6 • pointer
– 割り当てたメモリを指すポ インタ型 • allocate – メモリを割り当てる • deallocate – メモリを開放する • construct – オブジェクトを構築する • destroy – オブジェクトを破壊する • ..... メモリの割り当て・解放以外もできる!
7.
今⽇⾔いに来たこと 7 (de)?allocate をカスタ マイズしたら終わり,とい うそのふざけた幻想※をぶ ち壊しにきました. ※インターネッツを利⽤した当社独⾃の調査による
8.
C++03 のアロケータは あんまり使えない 8
9.
C++03 のアロケータは あんまり使えない あんまり使えない理由: • オブジェクト毎の状態を持てない 9
10.
C++03 のアロケータは あんまり使えない あんまり使えない理由: • オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない 10
11.
C++03 のアロケータは あんまり使えない あんまり使えない理由: • オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない •
オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない 11
12.
C++03 のアロケータは あんまり使えない あんまり使えない理由: • オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない •
オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない • オブジェクト毎の状態を持てない ≒⾮静的データメンバを持てない 12
13.
なぜオブジェクト毎の状態を持てな いような制限が C++03 のアロケー タに対してあるのか? 重要な制約 あるアロケータの値で
allocate されたメモリは,同じアロケー タの値で deallocate しないとい けない. 13
14.
アロケータと コンテナの swap の関係 14 pointer p_; allocator_type
a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge> vector<Hoge> 各々の a_ は各々の p_ が 指している領域を解放できる
15.
15 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> swap アロケータと コンテナの swap の関係
16.
16 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> 各々の a_ は各々の p_ が 指している領域について知らない swap アロケータと コンテナの swap の関係
17.
17 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> 各々の a_ は各々の p_ が 指している領域について知らない swap アロケータと コンテナの swap の関係
18.
18 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> じゃあアロケータも swap すれば良いじゃん? アロケータと コンテナの swap の関係 swap
19.
19 template<typename T, size_t N> class StackAllocator
{ ..... char storage_[N]; }; ところが swap できない アロケータの種類がある ここからメモリを割り当てる この型のアロケータ同⼠は swap できない
20.
Q. 状態を持ったアロケータと swap の問題どうすんの? A.
(in C++03) 実装依存です ≒ 規格がほとんど何も⾔ってないの で,アロケータはオブジェクト毎 の状態を持てないと仮定するしか ない. 20
21.
Allocators@C++03 について 街の⼈の声を聞いてきました 21
22.
22 Allocators@C++03 について 街の⼈の声を聞いてきました
23.
23 使いどころが限定されるが 使えないわけじゃない Allocators@C++03 について 街の⼈の声を聞いてきました
24.
24 使いどころが限定されるが 使えないわけじゃない 良く分かってそうな感じ Allocators@C++03 について 街の⼈の声を聞いてきました
25.
25 Allocators@C++03 について 街の⼈の声を聞いてきました
26.
26 Allocators@C++03 について 街の⼈の声を聞いてきました
27.
27 Allocators@C++03 について 街の⼈の声を聞いてきました オブジェクト毎に 情報持てなくても そんなに深刻じゃないよ
28.
28 深刻だろ,常識的に考えて… Allocators@C++03 について 街の⼈の声を聞いてきました オブジェクト毎に 情報持てなくても そんなに深刻じゃないよ
29.
29 Allocators@C++03 について 専⾨家の話を聞いてきました
30.
30 Allocators@C++03 について 専⾨家の話を聞いてきました Pablo Halpern (アロケータ補完計画メンバ)
31.
31 Allocators@C++03 について 専⾨家の話を聞いてきました Pablo Halpern (アロケータ補完計画メンバ) 標準化委員の誰かが 「単に間に合わなかっただけ」 ってゆってた
32.
Allocators@C++03 まとめ 32
33.
Allocators@C++03 まとめ 33 規格の⽂⾔を書くのが間に合いませんでした
34.
34 2013/06/22 Cryolite Boost.勉強会 #12
大阪 Allocators@C++11
35.
規格の⽂⾔ができました 35
36.
C++11 のアロケータでは 何が起きたか? 36
37.
アロケータに対する 異次元(?)の制限緩和 37
38.
アロケートノミクスの カスタマイズ戦略3本の⽮ 38 状態を持つアロケータ Stateful allocator スコープドアロケータモデル Scoped allocator
model アロケータへの配慮 Allocator-awareness
39.
制限緩和+3本の矢 =アロケータ株価の上昇 39 右肩上がり! 本発表終了時イマココ!
40.
制限緩和+3本の矢 =アロケータ株価の上昇 40 本発表終了時イマココ!
41.
Allocator-awareness アロケータへの配慮 41
42.
Allocator-awareness アロケータへの配慮 ユーザから指定された アロケータをちゃんと 使います. 42
43.
アロケータへの配慮 std::vector の例 (1/2) 43 pointer
p_; ..... MyClass MyClass MyClass ・・・・・(未構築) std::vector<MyClass> メモリは allocate で獲得, deallocate で解放 各 value_type オブジェクトは construct で構築, destroy で破壊 ポインタ型はアロケータで 指定されたものを使う
44.
44 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> コンテナの swap のときにアロケータを swap する・しない,を制御可 アロケータへの配慮 std::vector の例 (2/2) (propagate_on_container_*)
45.
45 pointer p_; allocator_type a_; ..... pointer p_; allocator_type a_; ..... vector<Hoge>
vector<Hoge> アロケータへの配慮 std::vector の例 (2/2) コンテナの swap のときにアロケータを swap する・しない,を制御可 (propagate_on_container_*)
46.
アロケータへの配慮 std::list の例 46 pointer head_; ..... MyClass v_; pointer next_; ..... std::list<MyClass> _ListNode MyClass
v_; pointer next_; ..... _ListNode ・・・・・
47.
状態を持つアロケータ Stateful Allocator 47
48.
状態を持つアロケータ Stateful Allocator アロケータがオブジェクト毎 の状態を持てます! 48
49.
状態を持つアロケータ Stateful Allocator アロケータがオブジェクト毎 の状態を持てます! アロケータがオブジェクト毎 の状態を持てます! 49
50.
状態を持つアロケータ Stateful Allocator アロケータがオブジェクト毎 の状態を持てます! アロケータがオブジェクト毎 の状態を持てます! アロケータがオブジェクト毎 の状態を持てます! 50
51.
C++11 のアロケータで 何ができるか? 51
52.
allocate/deallocate で⾃作 汎⽤メモリアロケータ……? 52
53.
allocate/deallocate で⾃作 汎⽤メモリアロケータ……? malloc@glibc「ほう? 汎⽤メモリアロケータを ⾃作……ですか.」 jemalloc「我々を超えてみせる,と?」 tcmalloc「これは楽しみですなぁククク…….」 53
54.
allocate/deallocate で⾃作 汎⽤メモリアロケータ……? malloc@glibc「ほう? 汎⽤メモリアロケータを ⾃作……ですか.」 jemalloc「我々を超えてみせる,と?」 tcmalloc「これは楽しみですなぁククク…….」 54 死にたくないのでスキップします
55.
55 超単純なアロケータ実装以外では ほとんど意味なかった←結論 allocate/deallocate で⾃作 汎⽤メモリアロケータの前に
56.
ここから初級の話その1 56
57.
(de)?allocate をカスタマイズ してメモリっぽいものを扱う 57
58.
(de)?allocate をカスタマイズ してメモリっぽいものを扱う 58 仮想ページ 仮想アドレス空間 mmap new shm_open & mmap
59.
(de)?allocate をカスタマイズ してメモリっぽいものを扱う 59 仮想ページ 仮想アドレス空間 mmap new shm_open & mmap もしかして:Boost.Interprocessのアロケータ
60.
(de)?allocate をカスタマイズ してメモリっぽいものを扱う 60 仮想ページ 仮想アドレス空間 mmap new shm_open & mmap もしかして:Boost.Interprocessのアロケータ Boost.Interprocess のアロケータは
stateful ですが, 標準のコンテナに乗せられます.
61.
ここから初級の話その2 61
62.
62 •メモリ使⽤総量,オブジェ クト総数のカウント •デバッグ⽤各種フック •各イベントを Boost.Signals2 で発⾏ •その他 allocate/deallocate, construct/destroy に フックを仕掛ける
63.
allocate/deallocate, construct/destroy に フックを仕掛ける 63 •メモリ使⽤総量,オブジェ クト総数のカウント •デバッグ⽤各種フック •各イベントを Boost.Signals2 で発⾏ •その他
64.
ここから中級の話その1 64
65.
pointer 型をスマート ポインタとしてカスタマイズ 65
66.
pointer 型をスマート ポインタとしてカスタマイズ 66 Q. アロケータを使う側が allocate/construct
に対応 する deallocate/destroy を ちゃんと呼び出すはずだから, スマートポインタにする必要 ないのでは?
67.
67 int main(){ vector<int> v(a); f(move(v)); ..... } void
f(vector v){ ..... ..... } a.exe (デバッグビルド) b.dll (リリースビルド) デバッグビルドの new で獲得したメモリを リリースビルドの delete で解放><; new/delete の ABI ⾮互換性の克服
68.
pointer 型をスマート ポインタとしてカスタマイズ 68 template<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 int 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.
ここから中級の話その1.5 70
71.
construct/destroy でコン テナ要素の⽣成をハック 71 vector<string> v; v.emplace(“Hello”); 呼ばれるコンストラクタは string(“Hello”)
72.
construct/destroy でコン テナ要素の⽣成をハック 72 template<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.
construct/destroy でコン テナ要素の⽣成をハック 73 template<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.
construct/destroy でコン テナ要素の⽣成をハック 74 vector<string, MyAlloc> v; v.emplace(“Hello”); 実際に呼ばれるコンストラクタは string(“Hello”, a_)
75.
construct/destroy でコン テナ要素の⽣成をハック 75 vector<string, MyAlloc> v; v.emplace(“Hello”); 実際に呼ばれるコンストラクタは string(“Hello”, a_) アロケータはコンテナ要素の構築 ⽅法を完全に乗っ取ることが可能.
76.
ここから中級の話その2 76
77.
77 Template<typename T> class IndirectPointer { T **p_; ..... T &operator*() { return **p_; } }; Template<typename
T> class IndirectAlloc; アロケータカスタマイズに よる ptr_containers
78.
78 Template<typename T> IndirectAlloc<T>::allocate; sizeof(T) *
n バイトではなく sizeof(T *) * n バイトを確保 アロケータカスタマイズに よる ptr_containers
79.
79 Template<typename T> IndirectAlloc<T>::allocate; Template<typename T> IndirectAlloc<T>::construct; sizeof(T)
* n バイトではなく sizeof(T *) * n バイトを確保 (T 型のオブジェクト) アロケータカスタマイズに よる ptr_containers
80.
80 vector<int, IndirectAlloc<int> > v; // boost::ptr_vector<int> 相当 list<int, IndirectAlloc<int> > l; // boost::ptr_list<int> 相当 アロケータカスタマイズに よる ptr_containers
81.
アロケータカスタマイズに よる ptr_containers 81 vector<int, IndirectAlloc<int> > v; // boost::ptr_vector<int> 相当 list<int, IndirectAlloc<int> > l; // boost::ptr_list<int> 相当 さらにアロケータの construct を加工し て,
factory に転送して動的多相な形で コンテナの要素を乗せることが可能.
82.
ここから上級の話 Scoped Allocator Model 82
83.
vector<string> v; 83 vector<string> に string を 追加し続ける例
84.
プログラム中のいろんな場所から 参照され,要素が追加されると仮定 vector<string> v; 84 v.emplace_back(“hoge”); v.emplace_back(“fuga”); vector<string> に string を 追加し続ける例
85.
vector の部分はメモリの再割り当て が必要だが, string
の部分は超単純 な割り当て戦略でよい. vector<string> v; 85 vector<string> に string を 追加し続ける例
86.
86 (外側のアロケータ) デフォルトのアロケータとして振る舞う (内側のアロケータ) 単純なアロケータ(リージョン・アリーナ) として振る舞う ネストされたアロケータ vector<string> に string を 追加し続ける例
87.
87 (外側のアロケータ) デフォルトのアロケータとして振る舞う construct で内側のアロケータを引数に追加 (内側のアロケータ) 単純なアロケータ(リージョン・アリーナ) として振る舞う NestedAllocator vector<string> に string を 追加し続ける例
88.
vector<string> に string を 追加し続ける例 88 vector<string, NestedAlloc<string> > v; v.emplace_back(“hoge”); v.emplace_back(“fuga”); v string “hoge” “fuga” ・ ・ ・ string ・ ・ ・外側のアロケータの メモリリソース 内側のアロケータの メモリリソース
89.
今⽇⾔いに来たこと(再掲) 89 アロケータは (de)?allocate をカスタ マイズしたら終わりではあ りません.
90.
allocate/deallocate を カスタマイズする前に 90 超単純なアロケータ実装以外では ほとんど意味なかった←結論
91.
超単純なアロケータとは? Region/Arena Allocator 91 メモリをドバっと確保して
92.
92 先頭から順に確保 超単純なアロケータとは? Region/Arena Allocator
93.
93 先頭から順に確保 超単純なアロケータとは? Region/Arena Allocator
94.
94 先頭から順に確保 超単純なアロケータとは? Region/Arena Allocator
95.
これからのアロケータ 95
96.
アロケータのカスタマイズに よる最⼤の弊害 96 アロケータのカスタマイズ = 型を変える = オブジェクト同⼠の 相互運⽤性低下
97.
型消去による動的多相アロケー タ – polymorphic_allocator 97 アロケータのカスタマイズ しつつ,型を消去してオブ ジェクト同⼠の相互運⽤性 を維持する
98.
polymorphic_allocator まとめ 98 規格の⽂⾔を書くのが間に合いませんでした
99.
polymorphic_allocator まとめ 99 規格の⽂⾔を書くのが間に合いませんでした
100.
100 201z/xx/yy Cryolite Boost.勉強会 #n
大阪 Allocators@C++14 coming soon... 1z
Download now