154 lines
6.6 KiB
Markdown
154 lines
6.6 KiB
Markdown
[basic.align]
|
||
|
||
# 6 Basics [[basic]](./#basic)
|
||
|
||
## 6.8 Memory and objects [[basic.memobj]](basic.memobj#basic.align)
|
||
|
||
### 6.8.3 Alignment [basic.align]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3727)
|
||
|
||
Object types have [*alignment requirements*](#def:alignment_requirement,implementation-defined "6.8.3 Alignment [basic.align]") ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types"), [[basic.compound]](basic.compound "6.9.4 Compound types"))
|
||
which place restrictions on the addresses at which an object of that type
|
||
may be allocated[.](#1.sentence-1)
|
||
|
||
An [*alignment*](#def:alignment "6.8.3 Alignment [basic.align]") is an implementation-defined
|
||
integer value representing the number of bytes between successive addresses
|
||
at which a given object can be allocated[.](#1.sentence-2)
|
||
|
||
An object type imposes an alignment
|
||
requirement on every object of that type; stricter alignment can be requested
|
||
using the alignment specifier ([[dcl.align]](dcl.align "9.13.2 Alignment specifier"))[.](#1.sentence-3)
|
||
|
||
Attempting to create an object ([[intro.object]](intro.object "6.8.2 Object model")) in storage that
|
||
does not meet the alignment requirements of the object's type
|
||
is undefined behavior[.](#1.sentence-4)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3739)
|
||
|
||
A [*fundamental alignment*](#def:alignment,fundamental "6.8.3 Alignment [basic.align]") is represented by an alignment
|
||
less than or equal to the greatest alignment supported by the implementation in
|
||
all contexts, which is equal toalignof(std::max_align_t) ([[support.types]](support.types "17.2 Common definitions"))[.](#2.sentence-1)
|
||
|
||
The alignment required for a type may be different when it is used as the type
|
||
of a complete object and when it is used as the type of a subobject[.](#2.sentence-2)
|
||
|
||
[*Example [1](#example-1)*: struct B { long double d; };struct D : virtual B { char c; };
|
||
|
||
When D is the type of a complete object, it will have a subobject of
|
||
type B, so it must be aligned appropriately for a long double[.](#2.sentence-3)
|
||
|
||
If D appears as a subobject of another object that also has B as a virtual base class, the B subobject might be part of a different
|
||
subobject, reducing the alignment requirements on the D subobject[.](#2.sentence-4)
|
||
|
||
â *end example*]
|
||
|
||
The result of the alignof operator reflects the alignment
|
||
requirement of the type in the complete-object case[.](#2.sentence-5)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3761)
|
||
|
||
An [*extended alignment*](#def:alignment,extended "6.8.3 Alignment [basic.align]") is represented by an alignment
|
||
greater than alignof(std::max_align_t)[.](#3.sentence-1)
|
||
|
||
It is implementation-defined
|
||
whether any extended alignments are supported and the contexts in which they are
|
||
supported ([[dcl.align]](dcl.align "9.13.2 Alignment specifier"))[.](#3.sentence-2)
|
||
|
||
A type having an extended alignment
|
||
requirement is an [*over-aligned type*](#def:type,over-aligned "6.8.3 Alignment [basic.align]")[.](#3.sentence-3)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
Every over-aligned type is or contains a class type
|
||
to which extended alignment applies (possibly through a non-static data member)[.](#3.sentence-4)
|
||
|
||
â *end note*]
|
||
|
||
A [*new-extended alignment*](#def:alignment,new-extended "6.8.3 Alignment [basic.align]") is represented by
|
||
an alignment greater than __STDCPP_DEFAULT_NEW_ALIGNMENT__ ([[cpp.predefined]](cpp.predefined "15.12 Predefined macro names"))[.](#3.sentence-5)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3774)
|
||
|
||
Alignments are represented as values of the type std::size_t[.](#4.sentence-1)
|
||
|
||
Valid alignments include only those values returned by an alignof expression for the fundamental types plus an additional implementation-defined
|
||
set of values, which may be empty[.](#4.sentence-2)
|
||
|
||
Every alignment value shall be a non-negative integral power of two[.](#4.sentence-3)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3782)
|
||
|
||
Alignments have an order from [*weaker*](#def:alignment,weaker "6.8.3 Alignment [basic.align]") to[*stronger*](#def:alignment,stronger "6.8.3 Alignment [basic.align]") or [*stricter*](#def:alignment,stricter "6.8.3 Alignment [basic.align]") alignments[.](#5.sentence-1)
|
||
|
||
Stricter
|
||
alignments have larger alignment values[.](#5.sentence-2)
|
||
|
||
An address that satisfies an alignment
|
||
requirement also satisfies any weaker valid alignment requirement[.](#5.sentence-3)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3788)
|
||
|
||
The alignment requirement of a complete type can be queried using analignof expression ([[expr.alignof]](expr.alignof "7.6.2.6 Alignof"))[.](#6.sentence-1)
|
||
|
||
Furthermore,
|
||
the narrow character types ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types")) shall have the weakest
|
||
alignment requirement[.](#6.sentence-2)
|
||
|
||
[*Note [2](#note-2)*:
|
||
|
||
This enables the ordinary character types to be used as the
|
||
underlying type for an aligned memory area ([[dcl.align]](dcl.align "9.13.2 Alignment specifier"))[.](#6.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3798)
|
||
|
||
Comparing alignments is meaningful and provides the obvious results:
|
||
|
||
- [(7.1)](#7.1)
|
||
|
||
Two alignments are equal when their numeric values are equal[.](#7.1.sentence-1)
|
||
|
||
- [(7.2)](#7.2)
|
||
|
||
Two alignments are different when their numeric values are not equal[.](#7.2.sentence-1)
|
||
|
||
- [(7.3)](#7.3)
|
||
|
||
When an alignment is larger than another it represents a stricter alignment[.](#7.3.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3807)
|
||
|
||
[*Note [3](#note-3)*:
|
||
|
||
The runtime pointer alignment function ([[ptr.align]](ptr.align "20.2.5 Pointer alignment"))
|
||
can be used to obtain an aligned pointer within a buffer;
|
||
an [*alignment-specifier*](dcl.attr.grammar#nt:alignment-specifier "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") ([[dcl.align]](dcl.align "9.13.2 Alignment specifier"))
|
||
can be used to align storage explicitly[.](#8.sentence-1)
|
||
|
||
â *end note*]
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/basic.tex#L3815)
|
||
|
||
If a request for a specific extended alignment in a specific context is not
|
||
supported by an implementation, the program is ill-formed[.](#9.sentence-1)
|