2012-05-19 3 views
5

내가이D에서 구조체 멤버를 정렬하는 방법?

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

하지만

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

시도 나에게 여전히 1 대신 8의 정렬을 말하는 실패합니다.

이유는 무엇이며 어떻게 수정해야합니까? 8의 값이 아닌 임의의 정렬에 대해 작동하도록하려면 어떻게해야합니까?

답변

5

DMD 소스를 살펴보면 alignofalign 속성을 고려하지 않은 것으로 보입니다.

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

이 값 alignsize()size_t 표현으로 .alignof 표현을 변환, 그래서 정적 배열 alignsize() 살펴 보자 :

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

그것은 그냥 여기

는 처리되는 곳이다 귀하의 경우 요소 유형 (void)의 정렬을 가져옵니다.

void가 바로 전달 TypeBasic::size(0)

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

다른 종류의 alignof을 처리하는 방법을 보면 TypeBasic::alignsize()에 의해 처리되고, align 특성을 전혀 고려처럼은 보이지 않는,하지만 난 잘못 될 수 . 수동으로 정렬을 테스트 해 보는 것이 좋습니다.

+0

축하합니다. 그래서'align'은 무엇을합니까? 장식용으로 그냥 있습니까? xD – Mehrdad

+0

'align'이 효과가 있다고 생각합니다. 그러나'alignof'는 타입의 정렬을 얻습니다. 그래서 그들은 별개의 것들입니다. –

+0

이상한, 나는'alignof'을 체크하도록 이끌어 낸 문제들에 부딪쳤다. – Mehrdad

관련 문제