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