?
このドキュメントでは、 php中國(guó)語(yǔ)ネットマニュアル リリース
作為類型說(shuō)明符之一出現(xiàn)在聲明語(yǔ)法中,以修改所聲明對(duì)象的對(duì)齊要求。
_Alignas ( expression ) | (1) | (since C11) |
---|---|---|
_Alignas ( type ) | (2) | (since C11) |
expression | - | any integer constant expression whose value is a valid alignment or zero |
---|---|---|
type | - | any type name |
此關(guān)鍵字也可用作方便宏alignas
,可在標(biāo)題中找到<stdalign.h>
。
只有在聲明不是位域的對(duì)象時(shí)才能使用 alignas 說(shuō)明符,并且不具有寄存器存儲(chǔ)類。它不能在函數(shù)參數(shù)聲明中使用,并且不能在 typedef 中使用。
在聲明中使用時(shí),聲明的對(duì)象的對(duì)齊要求將設(shè)置為。
1)表達(dá)式的結(jié)果,除非它為零
2)對(duì)類型的對(duì)齊要求,即對(duì) alignof(type)
除非這會(huì)削弱這種類型自然產(chǎn)生的對(duì)齊。
如果表達(dá)式計(jì)算為零,則此說(shuō)明符不起作用。
當(dāng)多個(gè) alignas 說(shuō)明符出現(xiàn)在同一個(gè)聲明中時(shí),將使用最嚴(yán)格的一個(gè)。
Alignas 說(shuō)明符只需要出現(xiàn)在對(duì)象的定義上,但是如果任何聲明使用了 alignas,它必須指定與定義上的 alignas 相同的對(duì)齊方式。如果不同的翻譯單元為同一對(duì)象指定不同的對(duì)齊,則行為是不確定的。
如最初公布的那樣,C11 不允許結(jié)構(gòu)和工會(huì)成員使用 alignas 規(guī)范; 這由 DR 444糾正了。
在 C ++中,說(shuō)明alignas
符也可以應(yīng)用于類/結(jié)構(gòu)體/聯(lián)合體類型和枚舉的聲明。這在 C 中不受支持,但可以通過(guò)在成員聲明中使用 alignas 來(lái)控制結(jié)構(gòu)類型的對(duì)齊方式(自 DR 444起)。
_Alignas
.
#include <stdalign.h>#include <stdio.h>// every object of type struct sse_t will be aligned to 16-byte boundary// (note: needs support for DR 444)struct sse_t{ alignas(16) float sse_data[4];}; // every object of type struct data will be aligned to 128-byte boundarystruct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars}; int main(void){ printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter}
輸出:
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)alignment of sse_t is 16
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
6.7.5對(duì)齊說(shuō)明符
6.2.8對(duì)象對(duì)齊(p:48-49)
7.15對(duì)齊<stdalign.h>(p:268)