> ## 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 est la routine d'allocation de mémoire intégrée de XBOX GDK utilisée lorsqu'un titre n'a pas fourni de rappel XMemAlloc personnalisé.

# XMemAllocDefault

La routine d'allocation de mémoire par défaut.

## Syntaxe

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

### Paramètres

*Size*    Type : SIZE\_T

\[in] Taille du bloc de mémoire demandé.

*Attributes*<br />Type : ULONGLONG

\[in] Attributs de l'allocation. Consultez [XALLOC\_ATTRIBUTES](/fr/reference/system/xmem/structs/xalloc_attributes)

**Valeur renvoyée**

Type : PVOID

Renvoie un pointeur vers le bloc de mémoire alloué.

**Remarques**

Deux fonctions par défaut sont exportées par le système : *XMemAllocDefault* et [*XMemFreeDefault*](/fr/reference/system/xmem/functions/xmemfreedefault). Elles représentent les valeurs initiales des hooks d'allocation. Si les titres choisissent de ne pas fournir leurs propres hooks d'allocation, ces allocateurs système par défaut sont utilisés à la place. Si les titres souhaitent fournir des hooks d'allocation à des fins de suivi, sans pour autant implémenter leur propre allocateur, ils peuvent appeler directement l'allocateur par défaut.

XMemAllocDefault prend les mêmes paramètres que [*XMemAlloc*](/fr/reference/system/xmem/functions/xmemalloc). Elle fournit l'implémentation du système d'exploitation de [*XMemAlloc*](/fr/reference/system/xmem/functions/xmemalloc) pour les titres qui ne souhaitent pas intercepter ce comportement, ou qui souhaitent revenir au comportement par défaut pour les cas qu'ils ne gèrent pas.

La plateforme XBOX fait passer toutes les allocations de mémoire de titre qu'elle effectue par [*XMemAlloc*](/fr/reference/system/xmem/functions/xmemalloc), ce qui permet aux développeurs de surveiller ou de gérer les besoins en mémoire de la plateforme. Les titres peuvent fournir leurs propres gestionnaires de mémoire pour tout ou partie des requêtes qui passent par [*XMemAlloc*](/fr/reference/system/xmem/functions/xmemalloc). Pour le reste, l'API **XMemAllocDefault** est utilisée. **XMemAllocDefault** traite les requêtes d'allocation au moyen de l'un des trois mécanismes suivants : HeapAlloc, VirtualAlloc ou une série de tas gérés en interne. Le choix entre ces trois mécanismes dépend du type et des exigences d'alignement de l'allocation.

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/reference/xmemallocdefault.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=08575c187c5f1f55e3f2d615628e570e" alt="Diagramme montrant que XMemAllocDefault sert d'interface vers HeapAlloc, VirtualAlloc et les tas Xmem" width="562" height="220" data-path="images/gdk/reference/xmemallocdefault.png" />

Chaque allocation de type **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** est dirigée vers **HeapAlloc** à condition qu'elle spécifie un alignement \<= 16 octets et une taille de page de 4 Ko.

Les allocations de type **XALLOC\_MEMTYPE\_PHYSICAL\_**\*, ou qui nécessitent une adresse 32 bits, ou qui sont > 128 Ko, ou qui nécessitent un alignement >= 64 Ko sont dirigées vers [*XMemVirtualAlloc*](/fr/reference/system/xmem/functions/xmemvirtualalloc).

Les allocations qui spécifient **XALLOC\_PAGESIZE\_2MB\_**\* sont dirigées vers [*XMemVirtualAlloc*](/fr/reference/system/xmem/functions/xmemvirtualalloc).

Les allocations de type **XALLOC\_MEMTYPE\_GRAPHICS\_**\* sont promues à une taille de page minimale de 64 Ko.

Sinon, l'allocation est gérée par le tas interne de **XMemAllocDefault**. Il existe deux tas pour chacun des 15 types d'allocation documentés ; l'un gère les allocations \< 4 Ko avec un alignement \<= 4 Ko (le tas « petits blocs ») et l'autre gère toutes les autres allocations (le tas « grands blocs »). Cela représente 30 tas au total.

**Détails des tas de XMemAllocDefault**

* Un tas est créé à la demande ; ainsi, s'il n'y a aucune allocation d'un type particulier pour une taille grande/petite donnée, le tas ne sera jamais créé.
* Chaque tas réserve 2 Go d'espace d'adressage virtuel. Par conséquent, un tas donné ne peut pas contenir plus de 2 Go d'allocations.
* Si un tas est configuré pour utiliser des pages de 2 Mo, chaque tas valide des pages de 2 Mo selon les besoins ; chaque allocation est donc satisfaite à partir d'une page de 2 Mo, même si des pages de 64 Ko sont demandées.  Par défaut, les tas qui utilisent des pages de 2 Mo sont autorisés à rétrograder vers des pages de 64 Ko si le système a épuisé les pages de 2 Mo.  Ce comportement de rétrogradation peut être désactivé en utilisant `eXMEMOPT_XMEMALLOCDEFAULT_DISABLEPAGESIZEDEMOTION` avec [*XMemSetOption*](/fr/reference/system/xmem/functions/xmemsetoption).
* Si un tas est configuré pour utiliser des pages de 64 Ko, chaque tas valide 512 Ko de pages selon les besoins.
* Chaque tas est monothread ; les requêtes d'allocation et/ou de libération simultanées provenant de plusieurs threads sont donc sérialisées. La sérialisation n'est requise qu'au sein de chaque tas individuel ; les requêtes simultanées provenant de tas différents peuvent donc être traitées simultanément.
* Chaque tas tente de regrouper les allocations aussi densément que possible (tout en respectant les contraintes d'alignement) afin de réduire la quantité de mémoire nécessaire au fonctionnement du tas.
* Chaque tas peut spécifier sa propre hystérésis d'allocation, qui détermine avec quelle rapidité la mémoire est rendue au système d'exploitation lorsqu'elle a été libérée. Par défaut, chaque tas graphique spécifie une hystérésis de 64 Mo, et les tas **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** spécifient 8 Mo (il est peu probable que ceux-ci soient jamais utilisés, car les allocations de tas pouvant être mises en cache ne spécifient généralement pas d'exigence d'alignement > 16 octets). Si l'hystérésis est définie sur 64 Mo, cela signifie que le tas doit accumuler 64 Mo de pages libres avant que des pages libres ne soient rendues au système d'exploitation. Cela garantit que le code du tas n'aura jamais besoin de solliciter à nouveau le système d'exploitation tant que la quantité de mémoire requise fluctue dans les limites de l'hystérésis.
* Les tas démarrent sans mémoire validée et demandent de la mémoire au système d'exploitation à la demande. Toutefois, un tas peut préallouer de la mémoire auprès du système d'exploitation si vous le souhaitez, en appelant [*XMemPreallocateFreeSpace*](/fr/reference/system/xmem/functions/xmempreallocatefreespace) pour ce tas. Cela porte en pratique la réserve de pages libres jusqu'à la limite d'hystérésis de ce tas.

**Voir aussi**

[*xmem\_set\_allocation\_hooks*](/fr/reference/system/xmem/macros/xmem_set_allocation_hooks)

[*xmem\_allocation\_hooks*](/fr/reference/system/xmem/structs/xmem_allocation_hooks)


## Related topics

- [XMemFreeDefault](/reference/system/xmem/functions/xmemfreedefault.md)
- [XMEMALLOC_ROUTINE callback](/reference/system/xmem/functions/xmemalloc_routine.md)
- [XMemSetOption](/reference/system/xmem/functions/xmemsetoption.md)
- [XMEM_OPTIONS](/reference/system/xmem/enums/xmem_options.md)
