Udostępnij za pośrednictwem


Stub-Allocated

Zamiast wymuszać odrębne wywołanie dla każdego węzła drzewa lub grafu, można kierować wycinki, aby obliczyć rozmiar danych oraz przydzielić i zwolnić pamięć, wykonując jedno wywołanie w celu midl_user_allocate lub midl_user_free. Atrybut ACF [allocate(all_nodes)] kieruje wycinki do przydzielania lub zwalniania wszystkich węzłów w jednym wywołaniu do funkcji zarządzania pamięcią dostarczonych przez użytkownika.

Na przykład aplikacja RPC może używać następującej struktury danych drzewa binarnego:

/* 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;

Atrybut ACF [allocate(all_nodes)] zastosowany do tego typu danych jest wyświetlany w deklaracji typedef w ACF jako:

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

Atrybut [przydziel] można zastosować tylko do typów wskaźników. Atrybut [przydziel] ACF jest rozszerzeniem firmy Microsoft do języka IDL DCE i, w związku z tym, nie jest dostępny, jeśli kompilujesz z przełącznikiem MIDL /osf. Gdy [przydziel(all_nodes)] jest stosowany do typu wskaźnika, wycinki generowane przez kompilator MIDL przechodzą przez określoną strukturę danych w celu określenia rozmiaru alokacji. Następnie wycinki tworzą pojedyncze wywołanie, aby przydzielić całą ilość pamięci wymaganej przez graf lub drzewo. Aplikacja kliencka może znacznie wydajniej zwolnić pamięć, wykonując jedno wywołanie midl_user_free. Jednak wydajność wycinków serwera jest zwykle zwiększana w przypadku korzystania z alokacji pamięci węzła po węźle, ponieważ wycinki serwera mogą często używać pamięci prywatnej, która nie wymaga alokacji.

Aby uzyskać dodatkowe informacje, zobacz Alokacja węzła po węźle i Deallocation.