2011-09-21 36 views
4

latest draft of the c++11 standard中,第3.11章討論了對齊。
後來,章7.6.1定義如何定義一個對準結構如何以獨立於平臺的方式設置對齊方式?

如果我這樣定義的結構(或變量):

alignas(16) struct A 
{ 
    int n; 
    unsigned char[ 1020 ]; 
}; 

不意味着A類的所有實例將被對齊到16個字節?

或者,我必須像下一個代碼那樣做嗎?

struct A 
{ 
    char data[300]; 
}; 
alignas(16) A a; 

如果兩個例子都不對,請問該如何正確使用?

PS我不是在尋找一個依賴編譯器的解決方案。

+2

僅供參考,n3242不是最新的草案。 :) –

回答

3

對齊首先是屬性類型。

它可以覆蓋alignas; alignas可以使用還可以使用將新對齊值分配給特定對象。

因此,這兩個示例都是有效的,並且將具有您推測的語義。

[n3290: 3.11/1]:對象類型有對準要求(3.9.1,3.9.2 ),其上的地址位置限制在其 一個對象,該類型可被分配。一個對齊是一個實現定義的 整數值,表示可以分配給定對象的連續 地址之間的字節數。 對象類型 對該類型的每個對象強加一個對齊要求; 可以使用對齊說明符 (7.6.2)來請求更嚴格的對齊。

[n3290: 7.6.2/1]:一種對準說明符可以應用於一個 變量或一類數據成員,但它不應被施加到 位字段,一個功能參數,一個鎖釦的形式參數 子句(15.3)或用register存儲類 說明符聲明的變量。 對齊說明符也可應用於類或枚舉類型的 聲明。一個對齊說明符 用省略號是一個包擴展(14.5.3)。

[n3290: 7.6.2/2]:當對準說明符的形式是 alignas(assignment-expression):

  • 賦值表達式必須是一個積分常數表達式
  • 如果常數表達式計算 到一個基本對準,的對齊要求如果常量 表達式評估爲擴展對齊,則聲明的 實體應爲指定的基本對齊
  • 實施 支持,在聲明的範圍內對準,聲明的實體的 對準應是對準
  • 如果 常量表達式的計算結果爲延長的對準和 實現不支持在的上下文中該對準 聲明,該程序是形成不良的
  • 如果常量表達式 計算結果爲零,對齊方式指定應無否則,是形成不良的程序效果
+0

你可以添加一個例子嗎? –

+0

@VJo:哼?你的問題有兩個例子。這個問題是關於驗證第一個例子,不是嗎? –

+0

對!我沒有馬上寫下如此多的文字。 –

相關問題