|
3454 | 3454 | \end{note}
|
3455 | 3455 | \indextext{object model|)}
|
3456 | 3456 |
|
| 3457 | +\rSec2[basic.align]{Alignment} |
| 3458 | + |
| 3459 | +\pnum |
| 3460 | +Object types have \defnx{alignment requirements}{alignment requirement!implementation-defined}\iref{basic.fundamental,basic.compound} |
| 3461 | +which place restrictions on the addresses at which an object of that type |
| 3462 | +may be allocated. An \defn{alignment} is an \impldef{alignment} |
| 3463 | +integer value representing the number of bytes between successive addresses |
| 3464 | +at which a given object can be allocated. An object type imposes an alignment |
| 3465 | +requirement on every object of that type; stricter alignment can be requested |
| 3466 | +using the alignment specifier\iref{dcl.align}. |
| 3467 | +Attempting to create an object\iref{intro.object} in storage that |
| 3468 | +does not meet the alignment requirements of the object's type |
| 3469 | +is undefined behavior. |
| 3470 | + |
| 3471 | +\pnum |
| 3472 | +A \defnadj{fundamental}{alignment} is represented by an alignment |
| 3473 | +less than or equal to the greatest alignment supported by the implementation in |
| 3474 | +all contexts, which is equal to |
| 3475 | +\tcode{\keyword{alignof}(std::max_align_t)}\iref{support.types}. |
| 3476 | +The alignment required for a type may be different when it is used as the type |
| 3477 | +of a complete object and when it is used as the type of a subobject. |
| 3478 | +\begin{example} |
| 3479 | +\begin{codeblock} |
| 3480 | +struct B { long double d; }; |
| 3481 | +struct D : virtual B { char c; }; |
| 3482 | +\end{codeblock} |
| 3483 | + |
| 3484 | +When \tcode{D} is the type of a complete object, it will have a subobject of |
| 3485 | +type \tcode{B}, so it must be aligned appropriately for a \tcode{\keyword{long} \keyword{double}}. |
| 3486 | +If \tcode{D} appears as a subobject of another object that also has \tcode{B} |
| 3487 | +as a virtual base class, the \tcode{B} subobject might be part of a different |
| 3488 | +subobject, reducing the alignment requirements on the \tcode{D} subobject. |
| 3489 | +\end{example} |
| 3490 | +The result of the \keyword{alignof} operator reflects the alignment |
| 3491 | +requirement of the type in the complete-object case. |
| 3492 | + |
| 3493 | +\pnum |
| 3494 | +An \defnadj{extended}{alignment} is represented by an alignment |
| 3495 | +greater than \tcode{\keyword{alignof}(std::max_align_t)}. It is \impldef{support for extended alignments} |
| 3496 | +whether any extended alignments are supported and the contexts in which they are |
| 3497 | +supported\iref{dcl.align}. A type having an extended alignment |
| 3498 | +requirement is an \defnadj{over-aligned}{type}. |
| 3499 | +\begin{note} |
| 3500 | +Every over-aligned type is or contains a class type |
| 3501 | +to which extended alignment applies (possibly through a non-static data member). |
| 3502 | +\end{note} |
| 3503 | +A \defnadj{new-extended}{alignment} is represented by |
| 3504 | +an alignment greater than \mname{STDCPP_DEFAULT_NEW_ALIGNMENT}\iref{cpp.predefined}. |
| 3505 | + |
| 3506 | +\pnum |
| 3507 | +Alignments are represented as values of the type \tcode{std::size_t}. |
| 3508 | +Valid alignments include only those values returned by an \keyword{alignof} |
| 3509 | +expression for the fundamental types plus an additional \impldef{alignment additional |
| 3510 | +values} |
| 3511 | +set of values, which may be empty. |
| 3512 | +Every alignment value shall be a non-negative integral power of two. |
| 3513 | + |
| 3514 | +\pnum |
| 3515 | +Alignments have an order from \defnx{weaker}{alignment!weaker} to |
| 3516 | +\defnx{stronger}{alignment!stronger} or \defnx{stricter}{alignment!stricter} alignments. Stricter |
| 3517 | +alignments have larger alignment values. An address that satisfies an alignment |
| 3518 | +requirement also satisfies any weaker valid alignment requirement. |
| 3519 | + |
| 3520 | +\pnum |
| 3521 | +The alignment requirement of a complete type can be queried using an |
| 3522 | +\keyword{alignof} expression\iref{expr.alignof}. Furthermore, |
| 3523 | +the narrow character types\iref{basic.fundamental} shall have the weakest |
| 3524 | +alignment requirement. |
| 3525 | +\begin{note} |
| 3526 | +This enables the ordinary character types to be used as the |
| 3527 | +underlying type for an aligned memory area\iref{dcl.align}. |
| 3528 | +\end{note} |
| 3529 | + |
| 3530 | +\pnum |
| 3531 | +Comparing alignments is meaningful and provides the obvious results: |
| 3532 | + |
| 3533 | +\begin{itemize} |
| 3534 | +\item Two alignments are equal when their numeric values are equal. |
| 3535 | +\item Two alignments are different when their numeric values are not equal. |
| 3536 | +\item When an alignment is larger than another it represents a stricter alignment. |
| 3537 | +\end{itemize} |
| 3538 | + |
| 3539 | +\pnum |
| 3540 | +\begin{note} |
| 3541 | +The runtime pointer alignment function\iref{ptr.align} |
| 3542 | +can be used to obtain an aligned pointer within a buffer; |
| 3543 | +an \grammarterm{alignment-specifier}\iref{dcl.align} |
| 3544 | +can be used to align storage explicitly. |
| 3545 | +\end{note} |
| 3546 | + |
| 3547 | +\pnum |
| 3548 | +If a request for a specific extended alignment in a specific context is not |
| 3549 | +supported by an implementation, the program is ill-formed. |
| 3550 | + |
3457 | 3551 | \rSec2[basic.life]{Lifetime}
|
3458 | 3552 |
|
3459 | 3553 | \pnum
|
|
4252 | 4346 | is that of their complete object\iref{intro.object}.
|
4253 | 4347 | \indextext{storage duration|)}%
|
4254 | 4348 |
|
4255 |
| -\rSec2[basic.align]{Alignment} |
4256 |
| - |
4257 |
| -\pnum |
4258 |
| -Object types have \defnx{alignment requirements}{alignment requirement!implementation-defined}\iref{basic.fundamental,basic.compound} |
4259 |
| -which place restrictions on the addresses at which an object of that type |
4260 |
| -may be allocated. An \defn{alignment} is an \impldef{alignment} |
4261 |
| -integer value representing the number of bytes between successive addresses |
4262 |
| -at which a given object can be allocated. An object type imposes an alignment |
4263 |
| -requirement on every object of that type; stricter alignment can be requested |
4264 |
| -using the alignment specifier\iref{dcl.align}. |
4265 |
| -Attempting to create an object\iref{intro.object} in storage that |
4266 |
| -does not meet the alignment requirements of the object's type |
4267 |
| -is undefined behavior. |
4268 |
| - |
4269 |
| -\pnum |
4270 |
| -A \defnadj{fundamental}{alignment} is represented by an alignment |
4271 |
| -less than or equal to the greatest alignment supported by the implementation in |
4272 |
| -all contexts, which is equal to |
4273 |
| -\tcode{\keyword{alignof}(std::max_align_t)}\iref{support.types}. |
4274 |
| -The alignment required for a type may be different when it is used as the type |
4275 |
| -of a complete object and when it is used as the type of a subobject. |
4276 |
| -\begin{example} |
4277 |
| -\begin{codeblock} |
4278 |
| -struct B { long double d; }; |
4279 |
| -struct D : virtual B { char c; }; |
4280 |
| -\end{codeblock} |
4281 |
| - |
4282 |
| -When \tcode{D} is the type of a complete object, it will have a subobject of |
4283 |
| -type \tcode{B}, so it must be aligned appropriately for a \tcode{\keyword{long} \keyword{double}}. |
4284 |
| -If \tcode{D} appears as a subobject of another object that also has \tcode{B} |
4285 |
| -as a virtual base class, the \tcode{B} subobject might be part of a different |
4286 |
| -subobject, reducing the alignment requirements on the \tcode{D} subobject. |
4287 |
| -\end{example} |
4288 |
| -The result of the \keyword{alignof} operator reflects the alignment |
4289 |
| -requirement of the type in the complete-object case. |
4290 |
| - |
4291 |
| -\pnum |
4292 |
| -An \defnadj{extended}{alignment} is represented by an alignment |
4293 |
| -greater than \tcode{\keyword{alignof}(std::max_align_t)}. It is \impldef{support for extended alignments} |
4294 |
| -whether any extended alignments are supported and the contexts in which they are |
4295 |
| -supported\iref{dcl.align}. A type having an extended alignment |
4296 |
| -requirement is an \defnadj{over-aligned}{type}. |
4297 |
| -\begin{note} |
4298 |
| -Every over-aligned type is or contains a class type |
4299 |
| -to which extended alignment applies (possibly through a non-static data member). |
4300 |
| -\end{note} |
4301 |
| -A \defnadj{new-extended}{alignment} is represented by |
4302 |
| -an alignment greater than \mname{STDCPP_DEFAULT_NEW_ALIGNMENT}\iref{cpp.predefined}. |
4303 |
| - |
4304 |
| -\pnum |
4305 |
| -Alignments are represented as values of the type \tcode{std::size_t}. |
4306 |
| -Valid alignments include only those values returned by an \keyword{alignof} |
4307 |
| -expression for the fundamental types plus an additional \impldef{alignment additional |
4308 |
| -values} |
4309 |
| -set of values, which may be empty. |
4310 |
| -Every alignment value shall be a non-negative integral power of two. |
4311 |
| - |
4312 |
| -\pnum |
4313 |
| -Alignments have an order from \defnx{weaker}{alignment!weaker} to |
4314 |
| -\defnx{stronger}{alignment!stronger} or \defnx{stricter}{alignment!stricter} alignments. Stricter |
4315 |
| -alignments have larger alignment values. An address that satisfies an alignment |
4316 |
| -requirement also satisfies any weaker valid alignment requirement. |
4317 |
| - |
4318 |
| -\pnum |
4319 |
| -The alignment requirement of a complete type can be queried using an |
4320 |
| -\keyword{alignof} expression\iref{expr.alignof}. Furthermore, |
4321 |
| -the narrow character types\iref{basic.fundamental} shall have the weakest |
4322 |
| -alignment requirement. |
4323 |
| -\begin{note} |
4324 |
| -This enables the ordinary character types to be used as the |
4325 |
| -underlying type for an aligned memory area\iref{dcl.align}. |
4326 |
| -\end{note} |
4327 |
| - |
4328 |
| -\pnum |
4329 |
| -Comparing alignments is meaningful and provides the obvious results: |
4330 |
| - |
4331 |
| -\begin{itemize} |
4332 |
| -\item Two alignments are equal when their numeric values are equal. |
4333 |
| -\item Two alignments are different when their numeric values are not equal. |
4334 |
| -\item When an alignment is larger than another it represents a stricter alignment. |
4335 |
| -\end{itemize} |
4336 |
| - |
4337 |
| -\pnum |
4338 |
| -\begin{note} |
4339 |
| -The runtime pointer alignment function\iref{ptr.align} |
4340 |
| -can be used to obtain an aligned pointer within a buffer; |
4341 |
| -an \grammarterm{alignment-specifier}\iref{dcl.align} |
4342 |
| -can be used to align storage explicitly. |
4343 |
| -\end{note} |
4344 |
| - |
4345 |
| -\pnum |
4346 |
| -If a request for a specific extended alignment in a specific context is not |
4347 |
| -supported by an implementation, the program is ill-formed. |
4348 |
| - |
4349 | 4349 | \rSec2[class.temporary]{Temporary objects}
|
4350 | 4350 |
|
4351 | 4351 | \pnum
|
|
0 commit comments