2012-05-19 34 views
5

BuYapı üyesi D olarak nasıl hizalanır?

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

ama

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

çalıştı bana hala 1 yerine 8 hizalamasını anlatan başarısız olur.

Neden bu, ve bunu nasıl gideririm, böylece 2 (yalnızca 8 değil) gücü olan herhangi bir keyfi hizalama için çalışır?

cevap

5

DMD kaynağına göz attığınızda, align öznitelikleri dikkate alınmaz.

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

Bu değere alignsize() ile size_t ifadesi içine .alignof ifadesini dönüştürür, bu nedenle statik bir dizi için alignsize() bakalım:

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

It sadece burada

ele alınır nerede Durumunuzdaki eleman tipinin (void) hizalanmasını sağlar.

void sadece ileriye TypeBasic::size(0)

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

diğer türleri alignof nasıl ele baktığımızda TypeBasic::alignsize() tarafından ele alınır, align nitelikleri hiç dikkate alınır gibi görünmüyor, ama yanlış olabilir . Hizalamayı manuel olarak test etmeye değer olabilir.

+0

lol bekle, ne yaparsın? Sadece dekorasyon için mi var? xD – Mehrdad

+0

Bence 'align' çalışıyor, ama 'alignof' sadece türün hizalanmasını alıyor, bu yüzden ayrı şeyler. –

+0

Weird, 'alignof' kontrol etmemi sağlayan sorunlara koşuyordum ... – Mehrdad

İlgili konular