Sdílet prostřednictvím


Agregace a sjednocení

Některé typy jako jsou pole (arrays), struktury (structs) a sjednocení (unions) mají přísnější požadavky na zarovnání, která zajišťují konzistentní agregace a sjednocení uložení a načtení dat. Zde jsou uvedeny definice pro pole (array), strukturu (struct) a sjednocení (union):

  • Pole
    Obsahuje uspořádanou skupinu sousedních datových objektů. Každý objekt, se nazývá prvek. Všechny prvky v rámci pole (array) mají stejnou velikost a datový typ.

  • Struktura
    Obsahuje uspořádanou skupinu sousedních datových objektů. Na rozdíl od prvků pole (array), mohou mít datové objekty v rámci struktury různé datové typy a velikosti. Každý datový objekt ve struktuře se nazývá člen.

  • Sjednocení
    Objekt, který uchovává některý z řady pojmenovaných členů. Členové pojmenované sady mohou být libovolného typu. Uložiště, přidělené pro sjednocení, je shodné s uložištěm potřebným pro největšího člena zmíněného spojení navíc ale s určitými požadavkami na zarovnání.

Následující tabulka zobrazuje důrazně navrhované zarovnání pro skalární členy sjednocení a struktur.

Skalární typy

Datové typy jazyka C++

Požadované zarovnání

INT8

char

Byte

UINT8

unsigned char

Byte

INT16

short

Word

UINT16

unsigned short

Word

INT32

int, long

Doubleword

UINT32

unsigned int, unsigned long

Doubleword

INT64

__int64

Quadword

UINT64

unsigned __int64

Quadword

FP32 (jednoduchá přesnost)

float

Doubleword

FP64 (dvojitá přesnost)

double

Quadword

POINTER

*

Quadword

__m64

struct __m64

Quadword

__m128

struct __m128

Octaword

Následující pravidla pro agregace zarovnání:

  • Zarovnání pole je stejné jako zarovnání jednoho prvku pole.

  • Zarovnání začátku struktury nebo sjednocení je maximem zarovnání každého jednotlivého člena. Každý člen v rámci struktury nebo sjednocení musí být umístěn na správném zarovnání podle definice v předchozí tabulce, což může v závislosti na předchozím členu vyžadovat implicitní vnitřní obalení.

  • Velikost struktury musí být celočíselným násobkem svého zarovnání, což může vyžadovat obalení za posledním členem. Vzhledem k tomu, že struktury a sjednocení mohou být seskupeny do polí, musí každý element pole struktury nebo sjednocení začínat a končit na předem správně stanoveném zarovnání.

  • Je možné zarovnat data takovým způsobem, aby byly větší než požadavky na zarovnání tak dlouho, dokud jsou zachována předchozí pravidla.

  • Zvláštní překladač může upravit obalování struktury z velikostních důvodů. Například /Zp (Struct Member Alignment) umožňuje upravování obalování struktury.

Viz také

Odkaz

Typy a úložiště