Поделиться через


Буферы Stub-Allocated

Вместо того, чтобы принудительно выполнять отдельный вызов для каждого узла дерева или графа, можно направить заглушки на вычисление размера данных и выделение и освобождение памяти, выполнив один вызов midl_user_allocate или midl_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)] , примененный к этому типу данных, отображается в объявлении typedef в ACF следующим образом:

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

Атрибут [allocate] может применяться только к типам указателей. Атрибут [allocate] ACF является расширением Майкрософт для DCE IDL и поэтому недоступен при компиляции с параметром MIDL /osf . При применении [allocate(all_nodes)] к типу указателя заглушки, созданные компилятором MIDL, проходят по указанной структуре данных, чтобы определить размер выделения. Затем заглушки делают один вызов для выделения всего объема памяти, необходимого для графа или дерева. Клиентское приложение может значительно эффективнее освободить память, выполнив один вызов midl_user_free. Однако производительность заглушки сервера обычно повышается при использовании выделения памяти между узлами, так как серверные заглушки часто могут использовать частную память, не требующую выделения.

Дополнительные сведения см. в разделе Распределение и освобождение узла.