2012-05-19 44 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