2011-08-05 2 views
6

T 유형의 객체의 기본 메모리로 사용되는 배열이 있습니다.어떻게 정렬 (T)을 시뮬레이션 할 수 있습니까?

char memory[sizeof T]; 
. 
. 
. 
new(memory) T(whatever); 

memoryT 객체에 대해 올바르게 정렬되었는지 어떻게 확인할 수 있습니까? C++ 0x에서

alignas(T) char memory[sizeof T]; 

하지만 Visual Studio 2010은 아직 특정 기능을 지원하지 않습니다.

답변

10

일반적인 (휴대용) 솔루션은 T에서 가장 기본 정렬이 필요한 기본 제공 형식의 메모리 선언을 공용 구조체에 넣는 것입니다. 가장 간단한 방법은 가능성이 후보 모두와 함께 노동 조합을 사용하는 것입니다 :

union MaxAlign 
{ 
    int     i  ; 
    long    l  ; 
    long long   ll ; 
    long double   ld ; 
    double    d  ; 
    void*    p  ; 
    void (*    pf)() ; 
    MaxAlign*   ps ; 
} ; 

union 
{ 
    MaxAlign dummyForAlignment; 
    unsigned char memory[sizeof(T)]; 
} rawT; 

내가 대해 훨씬 덜 만남, 위의 이 충분하지 않은 기계를 듣고 아직했습니다. 일반적으로 double 만 있으면 충분합니다. (인텔과 Sparc에서 충분히 이면 충분합니다.)

극단적 인 경우에 따라서 보다 많은 메모리를 할당 할 수 있습니다. T에는 하나 또는 두 개의 char 만 포함됩니다. 대부분의 시간이 정말 중요하지,하고 걱정 가치가 아니라, 경우는, 다음을 사용할 수 있습니다 않습니다이 경우

namespace MyPrivate { 

template< typename T, bool isSmaller > 
struct AlignTypeDetail ; 

template< typename T > 
struct AlignTypeDetail< T, false > 
{ 
    typedef T type ; 
} ; 

template< typename T > 
struct AlignTypeDetail< T, true > 
{ 
    typedef char type ; 
} ; 

template< typename T, typename U > 
struct AlignType 
{ 
    typedef typename AlignTypeDetail< U, (sizeof(T) < sizeof(U)) >::type 
         type ; 
} ; 
} 

template< typename T > 
union MaxAlignFor 
{ 
    typename MyPrivate::AlignType< T, char >::type  c ; 
    typename MyPrivate::AlignType< T, short >::type  s ; 
    typename MyPrivate::AlignType< T, int >::type   i ; 
    typename MyPrivate::AlignType< T, long >::type  l ; 
    typename MyPrivate::AlignType< T, long long >::type ll ; 
    typename MyPrivate::AlignType< T, float >::type  f ; 
    typename MyPrivate::AlignType< T, double >::type  d ; 
    typename MyPrivate::AlignType< T, long double >::type ld ; 
    typename MyPrivate::AlignType< T, void* >::type  pc ; 
    typename MyPrivate::AlignType< T, MaxAlign* >::type ps ; 
    typename MyPrivate::AlignType< T, void (*)() >::type pf ; 
} ; 

, MaxAlignFor<T>보다 더 큰 없을 것 T (필요한 정렬은 이 T의 크기보다 클 수 없으므로 충분한 정렬을 가짐).

표준에서 공식적으로 보장하지는 않습니다. 그러나 실제로는 이 실제로 작동합니다.

+0

당신은'enum' 대신에'union'을 의미합니다, 맞습니까? – fredoverflow

+0

예. 그 모범이 분명하게 나타났습니다. –

+0

@Mehrdad VC++가 특정 기능을 지원하지 않는다고합니다. 이것이 유일한 컴파일러라고는 말하지 않습니다. –

5

vc++ align에 대한 검색은 : __declspec(align(#))을 사용합니다.

+4

선두의'__'이 분명히 나타내는 것은 컴파일러에 특정한 확장입니다. –

+1

@JamesKanze : 3 년이 지났지 만 어쨌든 언급 할 것입니다. Visual C++에 대한 질문이 있습니다. – Mehrdad

+0

@JamesKanze : 죄송합니다. 실제로 전화로 댓글을 달았습니다. 나는 잘못된 게시물에 대해 언급하고있다. 귀하의 게시물에 대한 나의 답장은 여기에 귀하의 의견에 대한 회신으로 여기에있을 예정이었습니다. – Mehrdad

2

배열 보증이있는 힙에 메모리를 할당하거나 boost::aligned_storage을 사용하십시오.

3

T 표준 레이아웃이고, 조합이 그럼, 형성되는

union 
{ 
    T t; 
    char memory[sizeof T]; 
}; 

이 정렬되어야 하는지를.