5
struct Foo(T)
{
align(8) void[T.sizeof] data;
}
但
static assert(Foo!(int).data.alignof == 8);
失敗,告訴我對齊的8
仍然1
代替。
爲什麼是這樣的,我該如何解決這個問題,以便它適用於2(不僅僅是8)冪的任意對齊。
struct Foo(T)
{
align(8) void[T.sizeof] data;
}
但
static assert(Foo!(int).data.alignof == 8);
失敗,告訴我對齊的8
仍然1
代替。
爲什麼是這樣的,我該如何解決這個問題,以便它適用於2(不僅僅是8)冪的任意對齊。
瀏覽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
)。
void
由TypeBasic::alignsize()
,這在其他類型如何處理alignof
只是轉發到TypeBasic::size(0)
switch (ty)
{
...
case Tvoid:
size = 1;
break;
...
}
展望處理,它看起來並不像align
屬性被考慮在所有的,但我可能是錯的。這可能值得手動測試對齊。
大聲笑等等,'align'做什麼?它只是爲了裝飾嗎? xD – Mehrdad
我認爲'align'工作,但'alignof'只是獲得類型的對齊,所以它們是分開的東西。 –
奇怪的是,我遇到了一些問題,導致我檢查'alignof' ...必須仔細檢查.. – Mehrdad