Submit Search
カスタムメモリマネージャと高速なメモリアロケータについて
Feb 11, 2012
55 likes
29,618 views
A
alwei
1 of 33
Download now
Downloaded 151 times
Recommended
非同期処理の基礎
非同期処理の基礎
信之 岩永
2014/5/10 VSハッカソン 非同期勉強会 にて発表
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
Boost.勉強会 #7 中3女子でもわかる constexpr
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
sample by xbyak_aarch64
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
Modern Effective C++ 勉強会 Item 22の発表資料です。
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
プログラムを高速化するためのテクニックをまとめました。
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
C++MIX #5 資料
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
第5回VFX技術者交流会で発表した資料のフル版です。
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
NVIDIA Japan
2015年9月18日開催 GTC Japan 2015 講演資料 エヌビディア合同会社 プラットフォームビジネス本部 シニアCUDA エンジニア 森野 慎也 CUDA Tookitでは、Nsight、Visual Profilerなどの開発ツールが、標準で提供されています。本セッションでは、これらのツールを用いたデバッグ・プロファイリングの基本操作について、説明します。また、事例を用い、効率のよいデバッグ法、プロファイリング時の基本的な確認ポイントもあわせて紹介します。プラットフォームは、Windows、Linuxの両者が対象となります。
GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI
CEDEC2016で発表した内容です。 Cedilの資料ではPPTファイルできれいな画像でアニメーション効果などが確認できます。ここでは一部画像がにじんでしまっています。
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
メモリ管理の話
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 山村 達彦(ユニティ・テクノロジーズ・ジャパン合同会社) こんな人におすすめ ・ECSに興味がある方 ・大規模なステージのロード 受講者が得られる知見 ・DOTSの内側 ・レンダリングワークフロー ・DOTSのシリアライズ Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
オンラインゲームの仕組みや工夫を調べてみたのを社内勉強会で発表した。ときのスライド。の公開用。 オンラインゲームの種別とそれぞれの仕組みについての話と、オープンソースになっているQuakeの仕組みの話、という2つの話が主なトピック
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 小端 みより(株式会社ミクシィ) こんな人におすすめ ・Unityでより本格的なマルチプレイのゲームを作りたい方 ・そもそも通信や同期処理ってどうやって実装するの?という方 受講者が得られる知見 ・Unityで専用サーバを開発するメリットやその方法 ・Unityでサーバとクライアントを同時に開発するテクニック ・通信に関する知識、専用サーバを運用する方法 Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
2021/4/28 に東京大学で開催された<AIセミナーシリーズ> 「Arm CPUにおけるSIMDを用いた高速計算入門」講演会で使用した資料になります。
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
Takashi Komada
社内勉強会で使った資料を公開します。
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
オープンソースカンファレンス 2019 Tokyo/Spring 発表資料 #osc19tk https://www.ospn.jp/osc2019-spring/ 2019年2月22日(金)
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Talked at CEDEC 2018, 2018/08/22 - https://2018.cedec.cesa.or.jp/session/detail/s5b559852a6405
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda
プログラミング生放送勉強会 第46での発表資料です。 https://atnd.org/events/85177
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 河合 宜文(株式会社Cysharp) こんな人におすすめ ・C#を極めたいエンジニア ・パフォーマンスに興味のあるエンジニア ・プログラミング言語マニア 受講者が得られる知見 ・structに関する深い知識 ・パフォーマンス向上のヒント ・C#の新しい文法と活用法 Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
KMC 関東例会での講座の資料 (by @nojima)
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
2021年にインフィニットループ社内の新卒向け研修で使われた資料です。
Mask Material only in Early Z-passの効果と仕組み
Mask Material only in Early Z-passの効果と仕組み
エピック・ゲームズ・ジャパン Epic Games Japan
草木などMaskedマテリアルが多いシーンでGPU負荷を非常に減らすことが可能な"Mask Material only in Early Z-pass"オプションに関して、非常に簡単ですがその効果とレンダリングフローを説明しました。 ご参考になれば幸いです。
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
PFIセミナー 2016/04/28
More Related Content
What's hot
(20)
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
C++MIX #5 資料
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
第5回VFX技術者交流会で発表した資料のフル版です。
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
NVIDIA Japan
2015年9月18日開催 GTC Japan 2015 講演資料 エヌビディア合同会社 プラットフォームビジネス本部 シニアCUDA エンジニア 森野 慎也 CUDA Tookitでは、Nsight、Visual Profilerなどの開発ツールが、標準で提供されています。本セッションでは、これらのツールを用いたデバッグ・プロファイリングの基本操作について、説明します。また、事例を用い、効率のよいデバッグ法、プロファイリング時の基本的な確認ポイントもあわせて紹介します。プラットフォームは、Windows、Linuxの両者が対象となります。
GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI
CEDEC2016で発表した内容です。 Cedilの資料ではPPTファイルできれいな画像でアニメーション効果などが確認できます。ここでは一部画像がにじんでしまっています。
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
メモリ管理の話
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 山村 達彦(ユニティ・テクノロジーズ・ジャパン合同会社) こんな人におすすめ ・ECSに興味がある方 ・大規模なステージのロード 受講者が得られる知見 ・DOTSの内側 ・レンダリングワークフロー ・DOTSのシリアライズ Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
オンラインゲームの仕組みや工夫を調べてみたのを社内勉強会で発表した。ときのスライド。の公開用。 オンラインゲームの種別とそれぞれの仕組みについての話と、オープンソースになっているQuakeの仕組みの話、という2つの話が主なトピック
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 小端 みより(株式会社ミクシィ) こんな人におすすめ ・Unityでより本格的なマルチプレイのゲームを作りたい方 ・そもそも通信や同期処理ってどうやって実装するの?という方 受講者が得られる知見 ・Unityで専用サーバを開発するメリットやその方法 ・Unityでサーバとクライアントを同時に開発するテクニック ・通信に関する知識、専用サーバを運用する方法 Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
2021/4/28 に東京大学で開催された<AIセミナーシリーズ> 「Arm CPUにおけるSIMDを用いた高速計算入門」講演会で使用した資料になります。
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
Takashi Komada
社内勉強会で使った資料を公開します。
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
オープンソースカンファレンス 2019 Tokyo/Spring 発表資料 #osc19tk https://www.ospn.jp/osc2019-spring/ 2019年2月22日(金)
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Talked at CEDEC 2018, 2018/08/22 - https://2018.cedec.cesa.or.jp/session/detail/s5b559852a6405
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda
プログラミング生放送勉強会 第46での発表資料です。 https://atnd.org/events/85177
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
2019/9/25-6に開催されたUnite Tokyo 2019の講演スライドです。 河合 宜文(株式会社Cysharp) こんな人におすすめ ・C#を極めたいエンジニア ・パフォーマンスに興味のあるエンジニア ・プログラミング言語マニア 受講者が得られる知見 ・structに関する深い知識 ・パフォーマンス向上のヒント ・C#の新しい文法と活用法 Unityのイベント資料はこちらから: https://www.slideshare.net/UnityTechnologiesJapan/clipboards
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
KMC 関東例会での講座の資料 (by @nojima)
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
2021年にインフィニットループ社内の新卒向け研修で使われた資料です。
Mask Material only in Early Z-passの効果と仕組み
Mask Material only in Early Z-passの効果と仕組み
エピック・ゲームズ・ジャパン Epic Games Japan
草木などMaskedマテリアルが多いシーンでGPU負荷を非常に減らすことが可能な"Mask Material only in Early Z-pass"オプションに関して、非常に簡単ですがその効果とレンダリングフローを説明しました。 ご参考になれば幸いです。
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
PFIセミナー 2016/04/28
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
1076: CUDAデバッグ・プロファイリング入門
1076: CUDAデバッグ・プロファイリング入門
NVIDIA Japan
GPU最適化入門
GPU最適化入門
Takahiro KOGUCHI
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
【Unite Tokyo 2019】大量のオブジェクトを含む広いステージでも大丈夫、そうDOTSならね
UnityTechnologiesJapan002
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
UnityTechnologiesJapan002
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
ゲーム開発とデザインパターン
ゲーム開発とデザインパターン
Takashi Komada
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
Takuya Ueda
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
Mask Material only in Early Z-passの効果と仕組み
Mask Material only in Early Z-passの効果と仕組み
エピック・ゲームズ・ジャパン Epic Games Japan
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
カスタムメモリマネージャと高速なメモリアロケータについて
1.
カスタムメモリマネージャと 高速なメモリアロケータについて
@aizen76
2.
自己紹介 ハンドルネーム alwei Twitter ID
@aizen76 alweiもしくはaizenのどちらかを使っています 流浪のゲームプログラマ Wii、DS、PSP、PS3、3DSのゲームとか作ってた 2Dゲーム好きなのに、実は3Dゲームしか作ったことがない 最近触手軍団に仲間入りして、オンラインゲームを作り始めました アジャイルとかTDDとか勉強中
3.
自己紹介 根っからのVimmerだったり、Opera使いだったり、 Happy Hacking Keyboard使いだったり、SKK使いだったりで あとは極普通のC++er 闇の軍団とかこわい なのに気づいたら周りに沢山いたりしてガクブルしてます
4.
本題
5.
カスタムメモリマネージャ
6.
メモリ確保を監視、もしくは変更する C++においてnew演算子でメモリを確保する際に、 operatorオーバーロードでメモリ動作をフックします inline void* operator
new(std::size_t size) { return memAlloc(size); } inline void operator delete(void* deletePtr) { memFree(deletePtr); }
7.
何が嬉しいの? * メモリをどこで確保したのかわかる * 残りのメモリ量がわかる *
メモリの断片化具合がわかる * フリーストアやヒープ以外からでもメモリを取得出来る * メモリアラインメントが指定出来る * 状況によってメモリセクションを使い分けることが出来る * etc...
8.
楽なことばかりではない メモリを管理するということは自分で責任を持つということ メモリ関係のバグは言わば即死系なものや、 メモリ破壊による追跡不能なものが多い 自分のやっていることに自信がない限りは、 安易にメモリ管理しようとは思わないこと メモリ破壊バグで丸一日潰れるくらい覚悟する必要も コンソールゲームの世界ではメモリがカスタム出来ないと、 お話にならないことが多いのでやらざるえない
9.
カスタムメモリマネージャを 使用しての様々な実用例
10.
メモリリークを調べる newした場所を記憶し、そのメモリがどこで確保されたかを知る 確保したメモリをリスト化し、一定感覚で情報を ログとして出力させる 例えばゲームのステージ開始時と終了時をチェック ステージ開始時と終了時で差異が出ている場合は 警告として報告するなどするとすぐにリークが発覚する
11.
エラーチェック カスタムメモリマネージャで確保されたメモリかをチェック メモリを確保する際にヘッダ情報を追加しておく ヘッダには一意のシグニチャを付加(0xDEADC0DE等が有名) 確保と開放時にこれが一致しないとエラー ■ new内部 AllocHeader* header
= reinterpret_cast<AllocHeader*>(allocPtr) header->signature = 0xDEADC0DE; ■ delete内部 assert(header->signature == 0xDEADC0DE);
12.
エラーチェック メモリ確保時に確保サイズ末尾にマーカー情報を埋め込む マーカーは二度と書き換えられないので、変更があったら 不正扱いとしてエラー処理を行う 配列などで確保した際にデータが壊れていないかに役立つ ■ new内部 int* marker
= reinterpret_cast<int*>(memAddr + size); marker = MARKER_NUMBER; ■ delete内部 int* marker = reinterpret_cast<int*>(memAddr + size); assert(*marker == MARKER_NUMBER);
13.
更にもっと高度なメモリ管理
14.
デフラグ・メモリコンパクション 次々とメモリを確保していくと次第にメモリが断片化していく 断片化は長く起動するアプリケーションほど起きやすい 断片化が緩やかに進むといつかメモリが確保出来なくなる 小さいデータが大量にあって大きいデータを確保すると、 メモリの容量的には全然足りていても普通に確保出来ないことも ■ どうする?
C++以外の言語ではGCで勝手にお掃除してくれる メモリの情報を再配置(コンパクション)するしかない でもどうやって?
15.
スマートポインタでポインタをラップ 生ポインタをスマートポインタでラップして 確保されたポインタの情報を連結リストにする ポインタがスマートポインタにラップされているので、 リストを辿りながら少しずつメモリの内容を移動させていく インタフェースに制限を加えれば安全にコンパクション出来るはず アンチャーテッドで有名なノーティドッグ社のゲームエンジンでは 上記の方法で出来る限りスマートポインタを使用し、 安全にメモリの内容を定期的にデフラグしている
※Game Engine Architectureより
16.
デフラグコストの分割 ゲームはリアルタイム要求がとてもきついので、 単純にデフラグすればいいというものではない 特にデフラグとはメモリブロックのコピーなのでとても遅い 断片化は即死するわけではないので、 数フレームにわけて少しずつ移動させていけばいい 処理負荷が高い時などは自動的にデフラグを 停止する機能があったりすれば処理落ちにも強い
17.
メモリ管理はとても便利だが危険 メモリを管理するメリットというのは沢山あるが、 ややこしさはかなり増すので必要性がなければオススメ出来ない しかし上手くやればどんどん便利になるので、 積極的に活用すべき時は活用すべし 「えーマジメモリ管理!?」 「メモリ管理が許されるのは小学生までだよねー」 みたいに他のLLやVMで動く言語と比較されてバカにされても 負けずにメモリのことを正確に知りちゃんと扱いましょう
18.
高速なメモリアロケータ
19.
メモリアロケータとは 一般的にはメモリを確保する仕組みである 通常はフリーストア(ヒープ)上から取得するものだが、 メモリアロケータを自作することにより、それ以外の場所からでも 自由に取得出来るようにすることが出来る 通常、mallocやnewはフリーストア(ヒープ)から取得する しかしplacement new等を使用すればそれ以外の領域からでも メモリを扱うことが出来る 工夫次第でメモリ使用量を削減したり、高速に動作する アロケータを自作するようなことも可能
20.
様々なアロケータの紹介
21.
スタックアロケータ その名の通りスタックベースなアロケータ 先頭ブロックから順にメモリを取得していきます メモリの確保と開放は必ず同じ順番にならないといけない 確保されているメモリのサイズと順番がわかるため、 非常に高速でかつ、無駄なメモリを使用しない 欠点はメモリを自由に開放出来ない 一時的に大きなテンポラリバッファが必要な場合に有効
22.
両端スタックアロケータ スタックアロケータで使用する単一のメモリブロックの 最下位と最上位で互いにトレードオフを行い、 必要なメモリを分配しながら確保していく Midway社が開発したHydro Thunderというレースゲームでは 全てのメモリ割り当てが両端スタックアロケータになっており、 最下位スタックはレベルのロードやアンロードに使われ、 最上位スタックはテンポラリバッファとして使用していた メモリの断片化が一切起こらず、非常に高速に動作していた
23.
シングルフレームアロケータ これもスタックアロケータを使用したアロケータ ゲームの1フレームをメモリの寿命とする 次フレームの頭で全てのメモリは開放されるので、 自分でfreeやdeleteをする必要がない 寿命が固定されているので自分ではメモリを制御出来ない 確保したメモリを次フレームを跨って使用してはいけない 扱いは難しいが割り切って使えば非常に高速
24.
ダブルバッファアロケータ シングルフレームアロケータをダブルバッファにしたもの 確保したメモリは次のフレームまで持続し、 アクティブなバッファをフレームごとに切り替えて 寿命がきた時に自動で開放していく 1フレームだけ長生きするので、後で確保したメモリを使用して 処理させたいという時には非常に便利 自分でdeleteする必要がないのも一緒
25.
スモールオブジェクトアロケータ Modern C++ Designの作者、 Andrei
Alexandrescuさんが考案したアロケータ 小さいオブジェクトのメモリ確保に特化している 小さいオブジェクトを効率よく確保しつつサイズも抑える 本当に小さいオブジェクト向けらしい 具体的には32バイト程度で64バイト以上は普通に遅い? LokiというC++ライブラリの中ではあらゆるもので このアロケータを使用し、高速に動作しているらしい
26.
メモリプールアロケータ 固定長サイズの領域から固定サイズのメモリを確保する 必ず固定サイズなので確保時間も開放時間も常に一定 断片化の心配も一切ない deleteを忘れてもリークすることはないが、長時間開放しないと メモリプールを圧迫し、最終的にメモリが更に必要になる ■有名な実装 Boost.Pool Efficient
C++ MemoryPool
27.
メモリプールアロケータ メモリプールはかなり万能なアロケータ メモリ容量を無駄に使用してしまうという欠点を除けば、 newやmallocのデメリットはほぼ消しさることが出来る お手軽に使用出来るので、使わない手はない placement newを使用することにより、実装することも出来るが 自分で拡張出来るようにしておいた方が後々得することが多い 特に断片化知らずなので、断片化で悩んでいた人は これを使って解消しましょう
28.
実際にメモリプールを使ってみる
29.
汎用メモリプール!!
30.
汎用メモリプール newで確保するものを全てメモリプールから取得 メモリマネージャ内に5つ程度のメモリプールを作成しておく メモリマネージャが自動で複数あるプールから 必要なメモリサイズに応じてプールを選択する 大体16バイト〜256バイトくらいまでサポートすれば十分 それ以上のメモリを確保する際は通常のnewの処理を行う
31.
結論 汎用メモリプールが超万能 STLをバリバリ使っても「もう何も怖くない」状態 Boostだろうとメモリをフックしてしまえばどうにでもなる みんなもメモリプールを使って 「あのライブラリがメモリ確保しまくってオセーんだよ!!」 みたいな状況から脱却しましょう
32.
GitHubにてソースコード公開中!! https://github.com/alwei/MemoryMaster
33.
ご静聴ありがとうございました
Download