モジュール java.base
パッケージ java.lang.foreign

インタフェースSegmentAllocator

既知のすべてのサブインタフェース:
Arena
関数型インタフェース:
これは関数型インタフェースなので、ラムダ式またはメソッド参照の代入先として使用できます。

@FunctionalInterface public interface SegmentAllocator
「メモリー・セグメント」の割当てに使用できるオブジェクト。 このインタフェースを実装するクライアントは、allocate(long, long)メソッドを実装する必要があります。 セグメント・ロケータは、プリミティブや配列など、様々な種類のJava値からセグメントを作成するために役立つ複数のメソッドを定義します。

SegmentAllocatorは、「機能インタフェース」です。 クライアントは、ラムダ式またはメソッド参照を使用して、新しいセグメント・ロケータを簡単に取得できます:

SegmentAllocator autoAllocator = (byteSize, byteAlignment) -> Arena.ofAuto().allocate(byteSize, byteAlignment);

このインタフェースでは、一般的に使用されるロケータのファクトリを定義します:

  • slicingAllocator(MemorySegment)は、指定されたメモリー・セグメントを繰り返しスライスすることでメモリーが割り当てられる、効率的なスライス・ロケータを取得
  • prefixAllocator(MemorySegment)は、セグメントをラップするロケータを取得し、新しい割当てリクエストごとにそのコンテンツをリサイクルします。

セグメント・ロケータをAPIに渡すことは、クライアントがwhereと通信する場合、特定の操作(APIによって実行される)の結果をメモリー・セグメントとして格納する必要がある場合に特に役立ちます。 たとえば、downcall method handlesRESTRICTEDは、基礎となる外部関数が構造体を値で戻すことがわかっている場合に、追加のSegmentAllocatorパラメータを受け入れることができます。 事実上、ロケータ・パラメータは、外部関数の戻り値を格納する場所をリンカーに指示します。

APIのノート:
特に指定がないかぎり、allocate(long, long)メソッドはスレッド・セーフではありません。 さらに、ロケータによって割り当てられたメモリー・セグメントは、異なる有効期間に関連付けることができ、メモリーのリージョンの重複によって支えられることもあります。 このような理由から、クライアントは通常、所有するロケータとのみ対話する必要があります。

クライアントは、強いスレッド・セーフティ、存続期間および重複しない保証を提供する、かわりに「アリーナ」の使用を検討する必要があります。

導入されたバージョン:
22