2012-05-19 28 views
5

Tôi cố gắng nàyLàm cách nào để căn chỉnh thành viên cấu trúc trong D?

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

nhưng

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

thất bại, nói với tôi rằng sự liên kết vẫn còn 1 thay vì 8.

Tại sao điều này và cách khắc phục, sao cho nó hoạt động cho bất kỳ liên kết tùy ý nào có sức mạnh là 2 (không chỉ 8)?

Trả lời

5

Duyệt nguồn DMD, có vẻ như alignof không tính đến các thuộc tính align.

Đây là nơi nó được xử lý:

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

này chuyển đổi một biểu thức .alignof thành một biểu size_t với giá trị alignsize(), vì vậy chúng ta hãy nhìn vào alignsize() cho một mảng tĩnh:

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

Nó chỉ được căn chỉnh của loại phần tử (void) trong trường hợp của bạn.

void được xử lý bởi TypeBasic::alignsize(), mà chỉ về phía trước để TypeBasic::size(0)

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

Nhìn vào cách các loại xử lý alignof, nó không giống như align thuộc tính được đưa vào tính toán ở tất cả, nhưng tôi có thể là sai . Nó có thể là giá trị kiểm tra sự liên kết bằng tay.

+0

lol chờ đợi để 'align' làm gì? Có phải chỉ để trang trí? xD – Mehrdad

+0

Tôi nghĩ rằng 'align' hoạt động, nhưng' alignof' chỉ nhận được sự liên kết của loại, vì vậy chúng là những thứ riêng biệt. –

+0

Thật lạ lùng, tôi đã gặp phải những vấn đề khiến tôi kiểm tra 'alignof' ... phải kiểm tra lại .. – Mehrdad

Các vấn đề liên quan