Meh*_*dad 5 d alignment alignof
我试过这个
struct Foo(T)
{
align(8) void[T.sizeof] data;
}
Run Code Online (Sandbox Code Playgroud)
但
static assert(Foo!(int).data.alignof == 8);
Run Code Online (Sandbox Code Playgroud)
失败了,告诉我对齐仍然是1代替8.
为什么这样,以及如何修复它,以便它适用于2的幂(不仅仅是8)的任意对齐?
浏览DMD源,看起来alignof似乎没有考虑align属性.
这是处理它的地方:
... if (ident == Id::__xalignof)
{
e = new IntegerExp(loc, alignsize(), Type::tsize_t);
}
Run Code Online (Sandbox Code Playgroud)
这会将.alignof表达式转换为size_t带有值的表达式alignsize(),所以让我们看一下alignsize()静态数组:
unsigned TypeSArray::alignsize()
{
return next->alignsize();
}
Run Code Online (Sandbox Code Playgroud)
它只是void在你的情况下得到元素类型()的对齐方式.
void处理TypeBasic::alignsize(),只是转发TypeBasic::size(0)
switch (ty)
{
...
case Tvoid:
size = 1;
break;
...
}
Run Code Online (Sandbox Code Playgroud)
看看其他类型如何处理alignof,看起来根本不考虑align属性,但我可能是错的.可能值得手动测试对齐.