注: このサイトは非推奨になりました。このサイトは 2023 年 1 月 31 日を過ぎると停止され、トラフィックは https://protobuf.dev の新しいサイトにリダイレクトされます。その間、更新は protobuf.dev のみに行われます。

Area.h

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

#include <google/protobuf/arena.h>
namespace google::protobuf

このファイルでは、割り当てのパフォーマンスを向上させるために Arena アロケータを定義します。

このファイルのクラス

ArenaOptions は、ブロック割り当て動作を制御するアリーナ構築用のオプションの追加パラメータを提供します。
アリーナ アロケータ。
コンパイル時にタイプ T でアリーナをサポートすることを示すヘルパー タイプトレイト。

ArenaOptions を作成する

#include <google/protobuf/arena.h>
namespace google::protobuf

ArenaOptions は、ブロック割り当て動作を制御するアリーナ構築用のオプションの追加パラメータを提供します。

メンバー

size_t
start_block_size
システム malloc からリクエストされる最初のブロックのサイズを定義します。その他...
size_t
max_block_size
システム malloc からリクエストされる最大ブロックサイズを定義します(個々のアリーナの割り当てリクエストがこの最大サイズより大きいサイズでない限り)。その他...
char *
initial_block
アリーナで使用するメモリの初期ブロック。なしの場合は NULL。その他...
size_t
initial_block_size
初期ブロックのサイズ(指定されている場合)
void *(*
block_alloc
リクエストされたサイズのメモリブロックを返す Alloc メソッドへの関数ポインタ。その他...
void(*
block_dealloc
アリーナからブロックの所有権を取得する unloc メソッドへの関数ポインタ。その他...
ArenaOptions()

size_t ArenaOptions::start_block_size

システム malloc からリクエストされる最初のブロックのサイズを定義します。

後続のブロックサイズは、ジオメトリ シリーズ内で最大まで増加します。


size_t ArenaOptions::max_block_size

システム malloc からリクエストされる最大ブロックサイズを定義します(個々のアリーナの割り当てリクエストがこの最大サイズより大きいサイズでない限り)。

リクエストされたブロックサイズはこの値まで増加し、ここに入ります。


char * ArenaOptions::initial_block

アリーナで使用するメモリの初期ブロック。なしの場合は NULL。

指定した場合、ブロックは少なくともアリーナ自体と同じ存続期間が必要です。アリーナが破棄された場合でも、アリーナの作成者はブロックの所有権を保持します。


void *(* ArenaOptions::block_alloc

リクエストされたサイズのメモリブロックを返す Alloc メソッドへの関数ポインタ。

デフォルトでは、malloc 関数への ptr が含まれています。

注: block_alloc 関数と dealloc 関数は、malloc を含め、malloc や free と同様に動作することが想定されています。


void(* ArenaOptions::block_dealloc

アリーナからブロックの所有権を取得する unloc メソッドへの関数ポインタ。

デフォルトでは、無料呼び出しを行うラッパー関数への ptr が含まれています。

クラス アリーナ

#include <google/protobuf/arena.h>
namespace google::protobuf

アリーナ アロケータ。

Arena の割り当ては、通常の(ヒープベースの)割り当てを新しい / 削除に置き換えます。割り当てをより大きなブロックに集約し、一度にまとめて割り当てることでパフォーマンスが向上します。プロトコル メッセージは、以下の Arena::CreateMessage<T>(Arena*)を使用してアリーナに割り当てられ、アリーナが破棄されると自動的に解放されます。

これはスレッドセーフな実装です。複数のスレッドがアリーナから同時に割り当てることができます。破壊はスレッドセーフではなく、破棄スレッドは最初にアリーナのユーザーと同期する必要があります。

アリーナには 2 つの割り当てインターフェースがあります。CreateMessage<T> は、アリーナ対応の proto2 メッセージ タイプと、適切なプロトコル(以下を参照)を満たすその他のタイプです。Create<T> は任意のタイプ T です。タイプ T がサポートしている場合、CreateMessage<T> のほうが適しています。このインターフェースは、(i)作成されたオブジェクトへのアリーナ ポインタを渡して、そのサブオブジェクトと内部割り当てでもアリーナを使用できるようにし、(ii)可能であればオブジェクトのデストラクタ呼び出しを省略するためです。Create は、T 型に特別な要件を設定しません。アリーナが破棄されたときに、オブジェクトのデストラクタを呼び出します。

アリーナのメッセージ割り当てプロトコル(CreateMessage<T>(Arena* Area, Args&&... args)で使用)は、次のとおりです。

  • タイプ T には、少なくとも 2 つのコンストラクタが必要です。コンストラクタに T が割り当てられた時に呼び出される argsarena なし)と、アリーナに T が割り当てられると呼び出される Arena* arena, Args&&... args で呼び出されるコンストラクタです。2 番目のコンストラクタが NULL アリーナ ポインタで呼び出される場合、最初の(args のみ)のコンストラクタを呼び出すのと同等になる必要があります。
  • タイプ T には、特定の型トレイト(|InternalArenaConstructable_|)が必要です。これは通常、|void| に対する typedef です。このような型トレイトが存在しない場合、インスタンス化 CreateMessage<T> はコンパイルに失敗します。
  • 型 T の型は、|DestructorSkippable_| を持つことができます。この型トレイトが型に存在する場合、そのデストラクタは、NULL 以外のアリーナ ポインタを渡した場合にのみ呼び出されます。この型トレイトがその型に存在しない場合、その内側のアリーナが破棄されたときに、常にデストラクタが呼び出されます。

このプロトコルは、すべてのアリーナ対応の proto2 メッセージ クラスと、RepeatedPtrFieldMap などの protobuf コンテナタイプによって実装されます。プロトコルは protobuf の内部にあり、安定性は保証されていません。proto 以外のタイプは、このプロトコルに依存しないでください。

メンバー

const size_t
kBlockOverhead = = internal::ThreadSafeArena::kBlockHeaderSize + internal::ThreadSafeArena::kSerialArenaSize
オーバーヘッドをブロックするその他...
Arena()
平均的なユースケースに合わせて調整された、適切なデフォルト オプションを備えたデフォルト コンストラクタ。
Arena(char * initial_block, size_t initial_block_size)
指定された初期ブロックを除き、デフォルトのオプションを使用してアリーナを構築します。その他...
explicit
Arena(const ArenaOptions & options)
カスタム オプションを受け取る Arena コンストラクタ。その他
~Arena()
void
Init(const ArenaOptions & )
TODO(protobuf-team): コンストラクタを使用するように呼び出し元を修正し、このメソッドを削除する。
uint64
SpaceAllocated() const
以下に、モニタリングのルーティンを示します。その他...
uint64
SpaceUsed() const
アリーナが使用したスペースの合計を返します。その他...
uint64
Reset()
OwnDestructor() で登録されたデストラクタを呼び出し、Own() で登録したオブジェクトを消去した後、このアリーナによって割り当てられたすべてのストレージを解放します。詳細...
template void
Own(T * object)
アリーナが破棄またはリセットされたときに |delete| で解放されるヒープ割り当てオブジェクトのリストに |object| を追加します。
template void
OwnDestructor(T * object)
アリーナが破棄またはリセットされたときに手動でデストラクタが呼び出されるオブジェクトのリストに |object| を追加します。その他...
void
OwnCustomDestructor(void * object, void(*)(void *) destruct)
アリーナが破棄またはリセットされたときに手動で呼び出されるデストラクタのリストに、オブジェクトのカスタム メンバー関数を追加します。その他...
template static T *
CreateMessage(Arena * arena, Args &&... args)
アリーナ上に proto2 メッセージ オブジェクトを作成するための API。その他...
template static PROTOBUF_NDEBUG_INLINE T *
Create(Arena * arena, Args &&... args)
アリーナ上にオブジェクトを作成するための API。その他...
template static PROTOBUF_NDEBUG_INLINE T *
CreateArray(Arena * arena, size_t num_elements)
T のコンストラクタを呼び出すことなく、アリーナにオブジェクト タイプ T の配列を作成します。その他
template static Arena *
GetArena(const T * value)
|value| に関連付けられたアリーナを取得します。|value| がアリーナ対応メッセージの場合、または NULL になります。その他...

const size_t Arena::kBlockOverhead = = internal::ThreadSafeArena::kBlockHeaderSize + internal::ThreadSafeArena::kSerialArenaSize

オーバーヘッドをブロックする

サイズ N をその内部に収めるために、初期ブロックを過剰に割り当てる際の目安としてご利用ください。

警告: 複数のオブジェクトを割り当てる場合、特に、Arena が位置揃えの保証を変更すると、一連の割り当てが最初のブロックに収まるとは限りません。


Arena::Arena(
        char * initial_block,
        size_t initial_block_size)

指定された初期ブロックを除き、デフォルトのオプションを使用してアリーナを構築します。

呼び出し元に必要な唯一の構成が初期ブロックを提供する場合、ArenaOptions を渡す代わりに、このコンストラクタを使用する方が効率的です。


explicit Arena::Arena(
        const ArenaOptions & options)

カスタム オプションを受け取る Arena コンストラクタ。

利用可能なオプションについては、上記の ArenaOptions をご覧ください。


uint64 Arena::SpaceAllocated() const

以下に、モニタリングのルーティンを示します。

これらは割り当てられたメモリと使用済みメモリの概算値ですが、正確な値は実装ディールです。たとえば、割り当てられたスペースは成長ポリシーに依存します。単体テストでは使用しないでください。アリーナによって割り当てられた合計スペースを返します。これは、基盤となるブロックのサイズの合計となります。


uint64 Arena::SpaceUsed() const

アリーナが使用したスペースの合計を返します。

SpaceAllocated に似ていますが、空きスペースとブロック オーバーヘッドが含まれていません。返されるスペースの総量には、このメソッドの呼び出しと同時に実行される他のスレッドが使用するスペースは含まれません。


uint64 Arena::Reset()

OwnDestructor() で登録されたデストラクタを呼び出し、Own() で登録したオブジェクトを削除した後、このアリーナによって割り当てられたすべてのストレージを解放します。

この呼び出し後に、このアリーナに割り当てられたオブジェクトは使用できません。また、アリーナが使用した合計スペース(割り当てられたブロックサイズの合計)も返されます。このメソッドはスレッドセーフではありません。


template void Arena::OwnDestructor(
        T * object)

アリーナが破棄またはリセットされたときに手動でデストラクタが呼び出されるオブジェクトのリストに |object| を追加します。

これは Own() とは異なり、削除対象が |delete| によって基盤となるメモリを解放することはありません。したがって、通常は、アリーナによって割り当てられたメモリに対してプレースメントが新たに作成されたオブジェクトに対してのみ使用されます。


void Arena::OwnCustomDestructor(
        void * object,
        void(*)(void *) destruct)

アリーナが破棄またはリセットされたときに手動で呼び出されるデストラクタのリストに、オブジェクトのカスタム メンバー関数を追加します。

クラス独自のデストラクタだけでなく、任意のメンバー関数を指定できる点で OwnDestructor() と異なります。


template static T * Arena::CreateMessage(
        Arena * arena,
        Args &&... args)

アリーナ上に proto2 メッセージ オブジェクトを作成するための API。

渡されたアリーナが NULL の場合は、ヒープ割り当てオブジェクトが返されます。タイプ T は、cc .enable_arenas が true に設定された .proto ファイルで定義されるメッセージである必要があります。そうでない場合、コンパイル エラーが発生します。

RepeatedFieldRepeatedPtrField は、このメソッドを使用してアリーナで直接インスタンス化することもできます。

この関数は、上述のアリーナ メッセージ割り当てプロトコルを満たす任意の型 T も受け入れます。


template static PROTOBUF_NDEBUG_INLINE T *
    Arena::Create(
        Arena * arena,
        Args &&... args)

アリーナ上にオブジェクトを作成するための API。

オブジェクトのみがアリーナに作成されます。基礎となるポイント(proto2 メッセージの場合)は引き続きヒープに割り当てられます。通常、proto メッセージは CreateMessage<T>() で割り当てる必要があります。

T がアリーナ メッセージ構築プロトコル(InternalArenaConstructable_ トレイトとオプションの DestructorSkippable_ トレイト)を満たしている場合でも、上記のプロトコルに従わなくても T はブラックボックス型として扱われます(これらの特性がない場合と同様です)。具体的には、T のコンストラクタ引数は常に Create<T>() に渡される引数のみとなり、アリーナ ポインタは暗黙的に追加されません。さらに、デストラクタは常にアリーナの破棄時に呼び出されます(デストラクタが些細な場合を除く)。T の観点では、オブジェクトはヒープに割り当てられたものとして扱われます(基盤となるメモリはアリーナから取得されます)。


template static PROTOBUF_NDEBUG_INLINE T *
    Arena::CreateArray(
        Arena * arena,
        size_t num_elements)

T のコンストラクタを呼び出すことなく、アリーナにオブジェクト タイプ T の配列を作成します。

arena が null の場合、戻り値は delete[[]] x;(または ::operator delete[[]](x);)で解放する必要があります。安全に使用できるように、この関数はコンパイル時に(C++11 としてコンパイルされた場合)、T が自発的にデフォルトで構築可能で、自主的に破棄可能であることを確認します。


template static Arena * Arena::GetArena(
        const T * value)

|value| に関連付けられたアリーナを取得します。|value| がアリーナ対応メッセージの場合、または NULL になります。

可能であれば、呼び出しはコンパイル時に解決されます。value->GetArena() の呼び出しを仮想化せずに済むため、通常このメソッドを呼び出す必要はありません。

テンプレート クラス Arena::InternalHelper

#include <google/protobuf/arena.h>
namespace google::protobuf

template <typename >

メンバー

static Arena *
GetOwningArena(const T * p)
保護されている GetOwningArena に生成されたメッセージへのアクセスを提供します。
static Arena *
GetArenaForAllocation(const T * p)
生成されたメッセージに保護された GetArenaForAllocation へのアクセス権を付与します。

テンプレートの構造体 Arena::is_arena_structable

#include <google/protobuf/arena.h>
namespace google::protobuf

template <typename >

コンパイル時にタイプ T でアリーナをサポートすることを示すヘルパー タイプトレイト。

これは、テンプレート化されたユーティリティを上位レベルで構築する目的でのみ一般公開されています。

is_arena_structable<T>::value は、メッセージ タイプ T がアリーナのサポートを有効にしている場合は true、そうでない場合は false です。

is_destructor_skippable<T>::value は、メッセージ タイプ T がデストラクタをスキップしても安全であることをアリーナに伝えた場合は true であり、それ以外の場合は false です。

これは Arena にあります。なぜなら、基盤となる生成済みコード トレイトを表示するのに必要な友だち関係は Arena にあるからです。

メンバー

テンプレート 構造体 Arena::is_destructor_skippable

#include <google/protobuf/arena.h>
namespace google::protobuf

template <typename >

メンバー