Buffers de Stub-Allocated
Em vez de forçar uma chamada distinta para cada nó da árvore ou grafo, você pode direcionar os stubs para calcular o tamanho dos dados e alocar e liberar memória fazendo uma única chamada para midl_user_allocate ou midl_user_free. O atributo ACF [allocate(all_nodes)] direciona os stubs para alocar ou liberar todos os nós em uma única chamada para as funções de gerenciamento de memória fornecidas pelo usuário.
Por exemplo, um aplicativo RPC pode usar a seguinte estrutura de dados de árvore binária:
/* 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;
O atributo ACF [allocate(all_nodes)] aplicado a esse tipo de dados aparece na declaração typedef no ACF como:
/* ACF file fragment */
typedef [allocate(all_nodes)] P_TREE_TYPE;
O atributo [allocate] só pode ser aplicado a tipos de ponteiro. O atributo ACF [allocate] é uma extensão da Microsoft para IDL de DCE e, como tal, não estará disponível se você compilar com a opção MIDL /osf . Quando [allocate(all_nodes)] é aplicado a um tipo de ponteiro, os stubs gerados pelo compilador MIDL atravessam a estrutura de dados especificada para determinar o tamanho da alocação. Em seguida, os stubs fazem uma única chamada para alocar toda a quantidade de memória necessária para o grafo ou a árvore. Um aplicativo cliente pode liberar memória com muito mais eficiência fazendo uma única chamada para midl_user_free. No entanto, o desempenho de stub de servidor geralmente é aumentado ao usar a alocação de memória de nó por nó, pois os stubs de servidor geralmente podem usar memória privada que não requer alocações.
Para obter informações adicionais, consulte Alocação e desalocação de nó por nó.