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 tillchar
. - 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
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
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ärx
är ett konstant uttryck, ger enheten inställningenx
, om den stöds. -
alignas(T)
, därT
är en typ, ger enheten en justering som är lika med justeringskravet förT
, det vill sägaalignof(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.