Stub-Allocated 缓冲区

可以指示存根计算数据的大小,并通过对 midl_user_allocatemidl_user_free进行单个调用来分配和释放内存,而不是强制对树或图形的每个节点进行不同的调用。 ACF 属性 [allocate(all_nodes)] 指示存根在单个调用用户提供的内存管理功能中分配或释放所有节点。

例如,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 编译器生成的存根会遍历指定的数据结构以确定分配大小。 然后,存根进行单个调用,以分配图形或树所需的全部内存量。 客户端应用程序可以通过对 midl_user_free进行单个调用来更有效地释放内存。 但是,使用节点到节点内存分配时,服务器存根性能通常会增加,因为服务器存根通常可以使用不需要分配的专用内存。

有关详细信息,请参阅 节点按节点分配和解除分配