> ## 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 是內建的 XBOX GDK 記憶體配置常式，當遊戲未提供自訂 XMemAlloc 回呼時使用。

# XMemAllocDefault

預設的記憶體配置常式。

## 語法

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

### 參數

*Size*    類型：SIZE\_T

\[in] 所要求的記憶體區塊大小。

*Attributes*<br />類型：ULONGLONG

\[in] 配置的屬性。請參閱 [XALLOC\_ATTRIBUTES](/zh-TW/reference/system/xmem/structs/xalloc_attributes)

**傳回值**

類型：PVOID

傳回指向已配置記憶體區塊的指標。

**備註**

系統匯出兩個預設函式：*XMemAllocDefault* 和 [*XMemFreeDefault*](/zh-TW/reference/system/xmem/functions/xmemfreedefault)。這些代表配置攔截程序的初始值。如果遊戲選擇不提供自己的配置攔截程序，則會改用這些系統預設配置器。如果遊戲想要提供配置攔截程序以進行追蹤，但不想實作自己的配置器，則可以直接呼叫預設配置器。

XMemAllocDefault 接受與 [*XMemAlloc*](/zh-TW/reference/system/xmem/functions/xmemalloc) 相同的參數。它為不想攔截此行為，或想要在未處理的情況下回復為預設行為的遊戲，提供 [*XMemAlloc*](/zh-TW/reference/system/xmem/functions/xmemalloc) 的作業系統實作。

XBOX 平台會將其對遊戲記憶體進行的所有配置都透過 [*XMemAlloc*](/zh-TW/reference/system/xmem/functions/xmemalloc) 進行，讓開發人員有機會監視或處理平台的記憶體需求。遊戲可以針對透過 [*XMemAlloc*](/zh-TW/reference/system/xmem/functions/xmemalloc) 傳入的部分或全部要求提供自己的記憶體管理員。其餘的要求則使用 **XMemAllocDefault** API。**XMemAllocDefault** 透過以下三種機制之一來處理配置要求：HeapAlloc、VirtualAlloc 或一系列內部管理的堆積。要使用這三種機制中的哪一種，取決於配置的類型和對齊需求。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/reference/xmemallocdefault.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=08575c187c5f1f55e3f2d615628e570e" alt="顯示 XMemAllocDefault 作為 HeapAlloc、VirtualAlloc 和 Xmem 堆積之介面的圖表" width="562" height="220" data-path="images/gdk/reference/xmemallocdefault.png" />

每個類型為 **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** 的配置，只要指定的對齊 \<= 16 位元組且頁面大小為 4 KB，就會交由 **HeapAlloc** 處理。

類型為 **XALLOC\_MEMTYPE\_PHYSICAL\_**\* 的配置，或需要 32b 位址、或 > 128 KB、或需要對齊 >= 64 KB 的配置，都會交由 [*XMemVirtualAlloc*](/zh-TW/reference/system/xmem/functions/xmemvirtualalloc) 處理。

指定 **XALLOC\_PAGESIZE\_2MB\_**\* 的配置會交由 [*XMemVirtualAlloc*](/zh-TW/reference/system/xmem/functions/xmemvirtualalloc) 處理。

類型為 **XALLOC\_MEMTYPE\_GRAPHICS\_**\* 的配置會提升為最小 64 KB 的頁面大小。

否則，配置將由 **XMemAllocDefault** 的內部堆積處理。15 種已記載的配置類型各有兩個堆積；一個處理對齊 \<= 4 KB 且 \< 4 KB 的配置 (「小型區塊」堆積)，另一個處理所有其他配置 (「大型區塊」堆積)。總計共 30 個堆積。

**XMemAllocDefault 堆積詳細資料**

* 堆積會視需要建立，因此如果特定大型/小型大小沒有特定類型的配置，則永遠不會建立該堆積。
* 每個堆積會保留 2 GB 的虛擬位址空間。因此，指定堆積的配置不能超過 2 GB。
* 如果堆積設定為使用 2MB 頁面，每個堆積會視需要認可 2 MB 頁面，因此即使要求 64 KB 頁面，每個配置也會從 2 MB 頁面滿足。根據預設，如果系統的 2 MB 頁面已用盡，使用 2 MB 頁面的堆積可以降級為 64KB 頁面。您可以透過搭配 [*XMemSetOption*](/zh-TW/reference/system/xmem/functions/xmemsetoption) 使用 `eXMEMOPT_XMEMALLOCDEFAULT_DISABLEPAGESIZEDEMOTION` 來停用此降級行為。
* 如果堆積設定為使用 64KB 頁面，每個堆積會視需要認可 512 KB 的頁面。
* 每個堆積都是單一執行緒，因此來自多個執行緒的同時配置和/或釋放要求會被序列化。只有在每個個別堆積內才需要序列化，因此來自不同堆積的同時要求可以同時處理。
* 每個堆積會嘗試盡可能緊密地封裝配置 (同時仍滿足對齊條件約束)，以將支援堆積所需的記憶體量降到最低。
* 每個堆積可以指定自己的配置遲滯，這決定了記憶體釋放後歸還給作業系統的積極程度。根據預設，每個圖形堆積指定 64 MB 的遲滯，而 **XALLOC\_MEMTYPE\_HEAP\_CACHEABLE** 堆積指定 8 MB (這些堆積不太可能被使用，因為可快取的堆積配置通常不會指定 > 16 位元組的對齊需求)。如果遲滯設定為 64 MB，表示堆積必須累積 64 MB 的可用頁面，才會將任何可用頁面歸還給作業系統。這可確保只要所需的記憶體量在遲滯量內波動，堆積程式碼就永遠不需要再向作業系統要求。
* 堆積一開始沒有認可的記憶體，並會視需要向作業系統要求記憶體。不過，如有需要，堆積可以透過針對該堆積呼叫 [*XMemPreallocateFreeSpace*](/zh-TW/reference/system/xmem/functions/xmempreallocatefreespace)，從作業系統預先配置記憶體。這實際上會將該堆積的可用頁面保留量提升至遲滯上限。

**另請參閱**

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

[*xmem\_allocation\_hooks*](/zh-TW/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)
