Zoeken…


Invoering

Alle typen in C ++ hebben een uitlijning. Dit is een beperking van het geheugenadres waarbinnen objecten van dat type kunnen worden gemaakt. Een geheugenadres is geldig voor het maken van een object als het delen van dat adres door de uitlijning van het object een geheel getal is.

Type-uitlijningen zijn altijd een macht van twee (inclusief 1).

Opmerkingen

De norm garandeert het volgende:

  • De uitlijningsvereiste van een type is een deler van zijn grootte. Een klasse met grootte 16 bytes kan bijvoorbeeld een uitlijning hebben van 1, 2, 4, 8 of 16, maar niet 32. (Als de leden van een klasse slechts 14 bytes groot zijn, moet de klasse een uitlijningsvereiste hebben van 8, voegt de compiler 2 opvulbytes in om de grootte van de klasse gelijk te maken aan 16.)
  • De ondertekende en niet-ondertekende versies van een geheel getal hebben dezelfde uitlijningsvereiste.
  • Een aanwijzer om te void heeft dezelfde uitlijningsvereiste als een aanwijzer om te char .
  • De cv-gekwalificeerde en cv-niet-gekwalificeerde versies van een type hebben dezelfde uitlijningsvereiste.

Merk op dat hoewel uitlijning bestaat in C ++ 03, het pas in C ++ 11 mogelijk werd om uitlijning op te vragen (met behulp van alignof ) en uitlijning te regelen (met behulp van alignas ).

De uitlijning van een type opvragen

C ++ 11

De uitlijningsvereiste van een type kan worden opgevraagd met behulp van het sleutelwoord alignof als een unaire operator. Het resultaat is een constante uitdrukking van het type std::size_t , dat wil zeggen dat het tijdens het compileren kan worden geëvalueerd.

#include <iostream>
int main() {
    std::cout << "The alignment requirement of int is: " << alignof(int) << '\n';
}

Mogelijke output

De uitlijningsvereiste van int is: 4

Indien toegepast op een array, levert dit de uitlijningsvereiste van het elementtype op. Indien toegepast op een referentietype, levert dit de uitlijningsvereiste op van het type waarnaar wordt verwezen. (Verwijzingen zelf hebben geen uitlijning, omdat ze geen objecten zijn.)

Controle uitlijning

C ++ 11

Het sleutelwoord alignas kan worden gebruikt om een variabele, een lid van een klassegegevens, een verklaring of definitie van een klasse, of een verklaring of definitie van een opsomming te forceren, om een bepaalde uitlijning te krijgen, indien ondersteund. Het komt in twee vormen:

  • alignas(x) , waarbij x een constante uitdrukking is, geeft de entiteit de uitlijning x , indien ondersteund.
  • alignas(T) , waarbij T een type is, geeft de entiteit een uitlijning die gelijk is aan de uitlijningsvereiste van T , dat wil zeggen alignof(T) , indien ondersteund.

Als meerdere alignas op dezelfde entiteit worden toegepast, is de strengste van toepassing.

In dit voorbeeld is de buffer buf gegarandeerd op passende wijze worden uitgelijnd met een greep int object, hoewel het elementtype is unsigned char , die een zwakkere uitlijning eis hebben.

alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);

alignas kan niet worden gebruikt om een type een kleinere uitlijning te geven dan het type zonder deze verklaring zou hebben:

alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.

alignas , wanneer een gehele constante uitdrukking wordt gegeven, moet een geldige uitlijning worden gegeven. Geldige uitlijningen zijn altijd machten van twee en moeten groter zijn dan nul. Compilers zijn vereist om alle geldige uitlijningen te ondersteunen tot het type std::max_align_t . Zij kan groter zijn dan deze uitlijningen ondersteunen, maar ondersteuning voor het toewijzen van geheugen voor dergelijke voorwerpen beperkt. De bovenlimiet voor uitlijningen is afhankelijk van de implementatie.

C ++ 17 biedt directe ondersteuning in operator new voor het toewijzen van geheugen voor over-uitgelijnde types.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow