> ## 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.

# XALLOC_ATTRIBUTES

> XALLOC_ATTRIBUTES

# XALLOC\_ATTRIBUTES

Contém valores que descrevem os atributos de uma alocação de memória.

<a id="syntaxSection" />

## Sintaxe

```cpp theme={null}
typedef union _XALLOC_ATTRIBUTES {  
    ULONGLONG Attributes;  
    struct {  
        ULONGLONG ObjectType : 14;  
        ULONGLONG PageSize : 2;  
        ULONGLONG AllocatorId : 8;  
        ULONGLONG Alignment : 5;  
        ULONGLONG MemoryType : 4;  
        ULONGLONG Address32BitMapping : 1;  
        ULONGLONG reserved : 30;  
    } s;  
} XALLOC_ATTRIBUTES, *PXALLOC_ATTRIBUTES;  
```

<a id="membersSection" />

### Membros

*Attributes*\
Tipo: ULONGLONG

Os atributos da alocação de memória.

*ObjectType*\
Tipo: ULONGLONG

O tipo de alocação, conforme definido pelo subsistema que executa a alocação de memória. Para obter mais informações, consulte [ObjectType](#objecttypeSection).

*PageSize*\
Tipo: ULONGLONG

O tamanho de página alocado. Para obter mais informações sobre os valores permitidos, consulte [PageSize](#pagesizeSection).

*AllocatorId*\
Tipo: ULONGLONG

A ID do alocador do subsistema que executa a alocação. Cada alocação é associada a uma ID de alocador, que identifica o subsistema que está solicitando a alocação (ou a liberação) de memória. Há três fontes potenciais de alocações: componentes de título, de plataforma e de middleware. Para obter mais informações sobre IDs de alocador, consulte [XALLOC\_ALLOCATOR\_IDS](/pt-BR/reference/system/xmem/enums/xalloc_allocator_ids).

*Alignment*\
Tipo: ULONGLONG

O tipo de alinhamento necessário para a alocação. Para obter mais informações sobre os valores permitidos, consulte [Alignment](#alignmentSection).

*MemoryType*\
Tipo: ULONGLONG

O tipo de memória desejado para a alocação. Você pode escolher um dentre vários tipos de página visíveis para a GPU e comportamentos de cache, em comparação com valores úteis para alocações de memória somente da CPU. Para obter mais informações sobre os valores permitidos, consulte [MemoryType](#memorytypeSection).

*Address32BitMapping*\
Tipo: ULONGLONG

Se definido como 1, força a alocação a obter um endereço abaixo de 4GB (exigido pela GPU, por exemplo).

*reserved*\
Tipo: ULONGLONG

Reservado para uso interno.

<a id="remarksSection" />

## Comentários

Essa estrutura é usada pelas definições de sintaxe de [XMEMALLOC\_ROUTINE](/pt-BR/reference/system/xmem/functions/xmemalloc_routine) e [XMEMFREE\_ROUTINE](/pt-BR/reference/system/xmem/functions/xmemfree_routine) para, respectivamente, alocação e desalocação de memória.

<Note>
  O código-fonte da implementação padrão de [XMemAlloc](/pt-BR/reference/system/xmem/functions/xmemalloc) e [XMemFree](/pt-BR/reference/system/xmem/functions/xmemfree) é instalado como parte do Microsoft Game Development Kit (GDK). Para obter mais informações, consulte as funções `XMemAllocDefault` e `XMemFreeDefault` em `\GXDK\gameKit\Source\amd64\heap.c`.
</Note>

As seções a seguir fornecem mais informações sobre os valores permitidos e os detalhes de alocação.

<a id="objecttypeSection" />

### ObjectType

Os valores de *ObjectType* são definidos pelo alocador que executa a alocação, e seu título pode usar esses valores para rastrear diferentes tipos de objeto à medida que são alocados ou para variar o comportamento do seu alocador, dependendo do tipo.

Por exemplo, se você definisse um alocador para o seu sistema de partículas, poderia definir sua própria ID de alocador para o título como `TitleAllocatorID_ParticleSystem` e defini-la como 4, além de um pool para conter partículas que colidem apenas com o plano do chão no seu mecanismo. Esse pool poderia ter a ID de *ObjectType* 2, porque você já usou 0 para emissores e 1 para partículas que colidem. Tudo depende do que exatamente você deseja rastrear e de como seu mecanismo está estruturado.

Como alternativa, você pode não definir IDs com uma granularidade tão grosseira; em vez disso, você pode se basear na ID do alocador para diferentes comportamentos de alocação e usar a ID de *ObjectType* apenas para fins de rastreamento, com cada tipo de objeto no seu jogo tendo seu próprio valor, independentemente do subsistema.

O valor de *ObjectType* deve ser um inteiro entre 0 e 16383.

<a id="memorytypeSection" />

### MemoryType

Você pode especificar o tipo de memória a ser alocada definindo o valor de *MemoryType*. O parâmetro *MemoryType* deve ser definido como um dos valores a seguir.

| XALLOC\_MEMTYPE | Valor | Descrição |
| :- | :-: | :- |
| XALLOC\_MEMTYPE\_HEAP\_CACHEABLE | 0x0 | Indica que o bloco de memória não precisa ser visível para a GPU e deve ser armazenado em cache. |
| XALLOC\_MEMTYPE\_GRAPHICS\_WRITECOMBINE | 0x1 | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU e deve funcionar como memória de combinação de gravação. |
| XALLOC\_MEMTYPE\_GRAPHICS\_WRITECOMBINE\_GPU\_READONLY | 0x2 | Indica que o bloco de memória é somente leitura, está mapeado nas tabelas de páginas da GPU e deve funcionar como memória de combinação de gravação. Essa memória não é coerente com o cache da GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_CACHEABLE | 0x3 | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU e deve ser armazenado em cache e ser coerente com o cache da GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_CACHEABLE\_NONCOHERENT\_GPU\_READONLY | 0x4 | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU e, embora armazenada em cache pela CPU, essa memória não é coerente com o cache da GPU. É preciso ter cuidado extra com esse tipo de memória para evitar ver linhas de cache obsoletas na CPU ou na GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_COMMAND\_BUFFER\_WRITECOMBINE | 0x5 | Indica que o bloco de memória deve ser usado como buffer de comando da GPU ou do mecanismo de DMA e deve ser de combinação de gravação. Essa memória não é coerente com o cache da GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_COMMAND\_BUFFER\_CACHEABLE | 0x6 | Indica que o bloco de memória deve ser usado como buffer de comando da GPU ou do mecanismo de DMA e deve ser armazenado em cache e ser coerente com o cache da GPU. |
| XALLOC\_MEMTYPE\_PHYSICAL\_CACHEABLE | 0x7 | Indica que o bloco de memória é físico e armazenável em cache. |
| XALLOC\_MEMTYPE\_PHYSICAL\_WRITECOMBINE | 0x8 | Indica que o bloco de memória é físico e deve funcionar como memória de combinação de gravação. |
| XALLOC\_MEMTYPE\_PHYSICAL\_UNCACHED | 0x9 | Indica que o bloco de memória é físico e não armazenado em cache. |
| XALLOC\_MEMTYPE\_GRAPHICS\_GPU\_UNCACHED | 0xA | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU. A memória é acessada sem cache pela GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_SHADER\_CACHEABLE\_NONCOHERENT | 0xB | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU para execução de sombreador (somente leitura). A memória não é coerente com o cache da GPU. |
| XALLOC\_MEMTYPE\_GRAPHICS\_EXECUTABLE\_WRITECOMBINE | 0xC | Indica que o bloco de memória está mapeado nas tabelas de páginas da GPU para argumentos indiretos. A memória é de combinação de gravação na CPU, executável na GPU e não coerente com o cache da GPU. |

<a id="pagesizeSection" />

### PageSize

Você pode especificar o tamanho das páginas usadas na alocação de memória definindo o valor de *PageSize*. Esse parâmetro pode ter um dos valores mostrados na tabela a seguir.

| XALLOC\_PAGESIZE | Valor | Descrição |
| :- | :-: | :- |
| XALLOC\_PAGESIZE\_4KB | 0 | Alocar usando páginas de 4 KB. |
| XALLOC\_PAGESIZE\_64KB | 1 | Alocar usando páginas de 64 KB. |
| XALLOC\_PAGESIZE\_2MB | 2 | Alocar usando páginas de 2 MB. |

<a id="alignmentSection" />

### Alignment

Ao definir o valor de *Alignment*, seu código solicita um alinhamento específico para o bloco de memória retornado. Você também pode ver esse parâmetro como um valor de 2*n*, em que *n* é o alinhamento desejado. Ele pode ter os valores mostrados na tabela a seguir.

<Note>
  O alocador padrão sempre retorna um alinhamento mínimo de 16 bytes.
</Note>

| XALLOC\_ALIGNMENT |
| :- |
| XALLOC\_ALIGNMENT\_ANY |
| XALLOC\_ALIGNMENT\_4 |
| XALLOC\_ALIGNMENT\_16 |
| XALLOC\_ALIGNMENT\_32 |
| XALLOC\_ALIGNMENT\_64 |
| XALLOC\_ALIGNMENT\_128 |
| XALLOC\_ALIGNMENT\_256 |
| XALLOC\_ALIGNMENT\_512 |
| XALLOC\_ALIGNMENT\_1K |
| XALLOC\_ALIGNMENT\_2K |
| XALLOC\_ALIGNMENT\_4K |
| XALLOC\_ALIGNMENT\_8K |
| XALLOC\_ALIGNMENT\_16K |
| XALLOC\_ALIGNMENT\_32K |
| XALLOC\_ALIGNMENT\_64K |
| XALLOC\_ALIGNMENT\_128K |

<a id="suballocationSection" />

### Subalocação de memória não gráfica

A memória não gráfica (memória alocada usando XALLOC\_MEMTYPE\_HEAP\_CACHEABLE) é subalocada com base no tamanho de página e no alinhamento da alocação.

* Tamanho de página de 4 KB e alinhamento de 16 bytes:
  * Alocações menores que 4 KB são compactadas
  * Alocações maiores ou iguais a 4 KB são alinhadas a um múltiplo de 4 KB
* Tamanho de página de 64 KB ou 2 MB ou um alinhamento diferente de 16 bytes:
  * Alocações \<= 4 KB são arredondadas para cima até um múltiplo de 256 bytes
  * Alocações \<= 64 KB são arredondadas para cima até um múltiplo de 2 KB
  * Alocações \<= 128 KB são arredondadas para cima até 128 KB
  * Todas as outras alocações são arredondadas para cima até um limite de 2 MB

<a id="requirementsSection" />

## Requisitos

**Cabeçalho:** xmem.h

**Plataformas compatíveis:** consoles da família XBOX One e consoles XBOX Series

<a id="seealsoSection" />

## Confira também

[Visão geral da memória gráfica do GDK](/pt-BR/build/core-features/graphics/graphics-memory-overview)\
[XALLOC\_ALLOCATOR\_IDS](/pt-BR/reference/system/xmem/enums/xalloc_allocator_ids)\
[XMEMALLOC\_ROUTINE](/pt-BR/reference/system/xmem/functions/xmemalloc_routine)\
[XMEMFREE\_ROUTINE](/pt-BR/reference/system/xmem/functions/xmemfree_routine)\
[XMem](/pt-BR/reference/system/xmem/xmem_members)


## Related topics

- [XALLOC_ALLOCATOR_IDS](/reference/system/xmem/enums/xalloc_allocator_ids.md)
- [XMEMFREE_ROUTINE callback](/reference/system/xmem/functions/xmemfree_routine.md)
- [XMemPreallocateFreeSpace](/reference/system/xmem/functions/xmempreallocatefreespace.md)
