2012-05-19 34 views
5

我想這如何對齊D中的struct成員?

struct Foo(T) 
{ 
    align(8) void[T.sizeof] data; 
} 

static assert(Foo!(int).data.alignof == 8); 

失敗,告訴我對齊的8仍然1代替。

爲什麼是這樣的,我該如何解決這個問題,以便它適用於2(不僅僅是8)冪的任意對齊。

回答

5

瀏覽DMD源代碼,它看起來像alignof沒有考慮到align屬性。

這裏是它的處理:

... if (ident == Id::__xalignof) 
{ 
    e = new IntegerExp(loc, alignsize(), Type::tsize_t); 
} 

這是一個.alignof表達式轉換爲size_t表達值alignsize(),所以讓我們來看看alignsize()爲靜態數組:

unsigned TypeSArray::alignsize() 
{ 
    return next->alignsize(); 
} 

它只是在你的情況下得到元素類型的對齊(void)。

voidTypeBasic::alignsize(),這在其他類型如何處理alignof只是轉發到TypeBasic::size(0)

switch (ty) 
{ 
    ... 
    case Tvoid: 
     size = 1; 
     break; 
    ... 
} 

展望處理,它看起來並不像align屬性被考慮在所有的,但我可能是錯的。這可能值得手動測試對齊。

+0

大聲笑等等,'align'做什麼?它只是爲了裝飾嗎? xD – Mehrdad

+0

我認爲'align'工作,但'alignof'只是獲得類型的對齊,所以它們是分開的東西。 –

+0

奇怪的是,我遇到了一些問題,導致我檢查'alignof' ...必須仔細檢查.. – Mehrdad