次の方法で共有


Stub-Allocated バッファー

ツリーまたはグラフの各ノードに対して個別の呼び出しを強制するのではなく、スタブにデータのサイズを計算し、 midl_user_allocate または midl_user_freeを 1 回呼び出すことでメモリを割り当てて解放するように指示できます。 ACF 属性 [allocate(all_nodes)] は 、1 回の呼び出しですべてのノードをユーザーが指定したメモリ管理機能に割り当てるか解放するようにスタブに指示します。

たとえば、RPC アプリケーションでは、次のバイナリ ツリー データ構造を使用できます。

/* IDL file fragment */
typedef struct _TREE_TYPE 
{
    short sNumber;
    struct _TREE_TYPE * pLeft;
    struct _TREE_TYPE * pRight;
} TREE_TYPE;

typedef TREE_TYPE * P_TREE_TYPE;

このデータ型に適用される ACF 属性 [allocate(all_nodes)] は 、ACF の typedef 宣言に次のように表示されます。

/* ACF file fragment */
typedef [allocate(all_nodes)] P_TREE_TYPE;

[allocate] 属性はポインター型にのみ適用できます。 [allocate] ACF 属性は DCE IDL に対する Microsoft 拡張機能であり、MIDL /osf スイッチを使用してコンパイルする場合は使用できません。 ポインター型に [allocate(all_nodes)] を 適用すると、MIDL コンパイラによって生成されたスタブは、指定されたデータ構造を走査して割り当てサイズを決定します。 その後、スタブは 1 回の呼び出しを行って、グラフまたはツリーに必要なメモリの量全体を割り当てます。 クライアント アプリケーションでは、 midl_user_freeを 1 回呼び出すことで、メモリをより効率的に解放できます。 ただし、通常、ノードごとのメモリ割り当てを使用すると、サーバー スタブのパフォーマンスが向上します。これは、サーバー スタブでは割り当てを必要としないプライベート メモリを使用する場合が多いためです。

詳細については、「 ノードごとの割り当てと割り当て解除」を参照してください。