> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XMemAllocDefault

> XMemAllocDefault é a rotina interna de alocação de memória do XBOX GDK usada quando um título não fornece um retorno de chamada XMemAlloc personalizado.

# XMemAllocDefault

A rotina padrão de alocação de memória.

## Sintaxe

```cpp theme={null}
PVOID XMemAllocDefault(
                SIZE_T Size,
                ULONGLONG Attributes
)
```

### Parâmetros

*Size*    Tipo: SIZE\_T

\[in] Tamanho do bloco de memória que está sendo solicitado.

*Attributes*<br />Tipo: ULONGLONG

\[in] Atributos da alocação. Consulte [XALLOC\_ATTRIBUTES](/pt-BR/reference/system/xmem/structs/xalloc_attributes)

**Valor retornado**

Tipo: PVOID

Retorna um ponteiro para o bloco de memória alocado.

**Comentários**

Duas funções padrão são exportadas pelo sistema: *XMemAllocDefault* e [*XMemFreeDefault*](/pt-BR/reference/system/xmem/functions/xmemfreedefault). Elas representam os valores iniciais dos ganchos de alocação. Se os títulos optarem por não fornecer seus próprios ganchos de alocação, esses alocadores padrão do sistema serão usados. Se os títulos quiserem fornecer ganchos de alocação para fins de rastreamento, mas não quiserem implementar seu próprio alocador, eles poderão chamar o alocador padrão diretamente.

XMemAllocDefault usa os mesmos parâmetros que [*XMemAlloc*](/pt-BR/reference/system/xmem/functions/xmemalloc). Ela fornece a implementação do sistema operacional de [*XMemAlloc*](/pt-BR/reference/system/xmem/functions/xmemalloc) para títulos que não desejam interceptar o comportamento ou que desejam recorrer ao comportamento padrão nos casos que não tratam.

A plataforma XBOX canaliza todas as alocações que faz da memória do título por meio de [*XMemAlloc*](/pt-BR/reference/system/xmem/functions/xmemalloc), o que oferece aos desenvolvedores a oportunidade de monitorar ou tratar os requisitos de memória da plataforma. Os títulos podem fornecer seus próprios gerenciadores de memória para algumas ou todas as solicitações que passam por [*XMemAlloc*](/pt-BR/reference/system/xmem/functions/xmemalloc). Para o restante, a API **XMemAllocDefault** é usada. **XMemAllocDefault** atende às solicitações de alocação por meio de um destes três mecanismos: HeapAlloc, VirtualAlloc ou uma série de heaps gerenciados internamente. A decisão sobre qual desses três mecanismos usar depende do tipo e dos requisitos de alinhamento da alocação.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/reference/xmemallocdefault.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=08575c187c5f1f55e3f2d615628e570e" alt="Diagrama mostrando que XMemAllocDefault atua como a interface para HeapAlloc, VirtualAlloc e heaps Xmem" width="562" height="220" data-path="images/gdk/reference/xmemallocdefault.png" />

Toda alocação do tipo **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** irá para **HeapAlloc**, desde que especifique um alinhamento \<= 16 bytes e um tamanho de página de 4 KB.

Alocações do tipo **XALLOC\_MEMTYPE\_PHYSICAL\_**\*, ou que exigem um endereço de 32 bits, ou que são > 128 KB, ou que exigem um alinhamento >= 64 KB irão para [*XMemVirtualAlloc*](/pt-BR/reference/system/xmem/functions/xmemvirtualalloc).

Alocações que especificam **XALLOC\_PAGESIZE\_2MB\_**\* irão para [*XMemVirtualAlloc*](/pt-BR/reference/system/xmem/functions/xmemvirtualalloc).

Alocações do tipo **XALLOC\_MEMTYPE\_GRAPHICS\_**\* serão promovidas para um tamanho mínimo de página de 64 KB.

Caso contrário, a alocação será tratada pelo heap interno de **XMemAllocDefault**. Há dois heaps para cada um dos 15 tipos de alocação documentados; um trata alocações \< 4 KB com alinhamento \<= 4 KB (o heap de "blocos pequenos") e o outro trata todas as demais alocações (o heap de "blocos grandes"). Isso soma 30 heaps no total.

**Detalhes do heap de XMemAllocDefault**

* Um heap é criado sob demanda; portanto, se não houver alocações de um tipo específico para um determinado tamanho grande/pequeno, o heap nunca será criado.
* Cada heap reservará 2 GB de espaço de endereço virtual. Portanto, não pode haver mais de 2 GB de alocações para um determinado heap.
* Se um heap estiver configurado para usar páginas de 2 MB, cada heap confirmará páginas de 2 MB conforme necessário; assim, toda alocação será atendida a partir de uma página de 2 MB, mesmo que páginas de 64 KB sejam solicitadas.  Por padrão, heaps que usam páginas de 2 MB podem ser rebaixados para páginas de 64 KB se o sistema esgotar as páginas de 2 MB.  Esse comportamento de rebaixamento pode ser desabilitado usando `eXMEMOPT_XMEMALLOCDEFAULT_DISABLEPAGESIZEDEMOTION` com [*XMemSetOption*](/pt-BR/reference/system/xmem/functions/xmemsetoption).
* Se um heap estiver configurado para usar páginas de 64 KB, cada heap confirmará 512 KB de páginas conforme necessário.
* Cada heap é de thread único; portanto, solicitações simultâneas de alocação e/ou liberação de vários threads serão serializadas. A serialização só é necessária dentro de cada heap individual; portanto, solicitações simultâneas de heaps diferentes podem ser tratadas simultaneamente.
* Cada heap tentará compactar as alocações da forma mais densa possível (ainda atendendo às restrições de alinhamento) para minimizar a quantidade de memória necessária para dar suporte ao heap.
* Cada heap pode especificar sua própria histerese de alocação, que determina com que agressividade a memória será devolvida ao sistema operacional quando for liberada. Por padrão, cada heap de gráficos especifica uma histerese de 64 MB, e os heaps **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** especificam 8 MB (é improvável que eles sejam usados, já que alocações de heap armazenáveis em cache normalmente não especificam um requisito de alinhamento > 16 bytes). Se a histerese for definida como 64 MB, isso significa que o heap precisará acumular 64 MB de páginas livres antes que qualquer página livre seja devolvida ao sistema operacional. Isso garante que o código do heap nunca precise recorrer ao sistema operacional enquanto a quantidade de memória necessária variar dentro do valor da histerese.
* Os heaps começam sem memória confirmada e solicitam memória ao sistema operacional sob demanda. No entanto, um heap pode pré-alocar memória do sistema operacional, se desejado, chamando [*XMemPreallocateFreeSpace*](/pt-BR/reference/system/xmem/functions/xmempreallocatefreespace) para esse heap. Isso efetivamente eleva a reserva de páginas livres até o limite de histerese desse heap.

**Confira também**

[*xmem\_set\_allocation\_hooks*](/pt-BR/reference/system/xmem/macros/xmem_set_allocation_hooks)

[*xmem\_allocation\_hooks*](/pt-BR/reference/system/xmem/structs/xmem_allocation_hooks)


## Related topics

- [XMemFreeDefault](/pt-BR/reference/system/xmem/functions/xmemfreedefault.md)
- [Retorno de chamada XMEMALLOC_ROUTINE](/pt-BR/reference/system/xmem/functions/xmemalloc_routine.md)
- [XMemSetOption](/pt-BR/reference/system/xmem/functions/xmemsetoption.md)
- [XMEM_OPTIONS](/pt-BR/reference/system/xmem/enums/xmem_options.md)
- [XMemSetAllocationHooks](/pt-BR/reference/system/xmem/functions/xmemsetallocationhooks.md)
