Sök…


Introduktion

Alla typer i C ++ har en justering. Detta är en begränsning av minnesadressen som objekt av den typen kan skapas inom. En minnesadress är giltig för ett objekts skapelse om att dela den adressen med objektets inriktning är ett heltal.

Typjusteringar är alltid en effekt av två (inklusive 1).

Anmärkningar

Standarden garanterar följande:

  • Justeringskravet för en typ är en delare av dess storlek. Till exempel kan en klass med storlek 16 byte ha en justering av 1, 2, 4, 8 eller 16, men inte 32. (Om en klassens medlemmar endast har 14 byte i storlek, men klassen måste ha ett justeringsbehov av 8 kommer kompilatorn att sätta in två stoppningsbyte för att göra klassens storlek lika med 16.)
  • De signerade och osignerade versionerna av en heltalstyp har samma justeringskrav.
  • En pekare som ska void har samma justeringskrav som en pekare till char .
  • De cv-kvalificerade och cv-okvalificerade versionerna av en typ har samma justeringskrav.

Observera att medan justering existerar i C ++ 03, var det inte förrän C ++ 11 som det blev möjligt att fråga inriktning (med alignof ) och kontrollinriktning (med hjälp av alignas ).

Fråga efter anpassning av en typ

c ++ 11

Justeringskravet av en typ kan ifrågasättas med hjälp av nyckelordet alignof som en unär operatör. Resultatet är ett konstant uttryck av typen std::size_t , dvs det kan utvärderas vid sammanställningstiden.

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

Möjlig utgång

Justeringskravet för int är: 4

Om den tillämpas på en matris ger det justeringskravet för elementtypen. Om den tillämpas på en referenstyp ger det justeringskravet för den refererade typen. (Referenser själva har ingen justering, eftersom de inte är objekt.)

Kontrollera inriktningen

C ++ 11

alignas nyckelordet kan användas för att tvinga en variabel, klassdatamedlem, deklaration eller definition av en klass, eller deklaration eller definition av enum, att ha en viss justering, om det stöds. Det finns i två former:

  • alignas(x) , där x är ett konstant uttryck, ger enheten inställningen x , om den stöds.
  • alignas(T) , där T är en typ, ger enheten en justering som är lika med justeringskravet för T , det vill säga alignof(T) , om det stöds.

Om flera alignas tillämpas på samma enhet gäller den striktaste.

I detta exempel, buffert buf är garanterad att vara lämpligt inriktade för att hålla ett int -objekt, även om dess elementtyp är unsigned char , som kan ha en svagare krav inriktning.

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

alignas kan inte användas för att ge en typ en mindre justering än typen skulle ha gjort utan denna deklaration:

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 , när de ges ett heltalskonstant uttryck, måste ges en giltig justering. Giltiga inställningar är alltid krafter på två och måste vara större än noll. Kompilatorer krävs för att stödja alla giltiga justeringar upp till justeringen av typen std::max_align_t . De kan stödja större anpassningar än detta, men stöd för att tilldela minne för sådana objekt är begränsat. Den övre gränsen för justeringar är implementeringsberoende.

C ++ 17 har direkt support i operator new för allokering av minne för överinriktade typer.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow