일반적인 (휴대용) 솔루션은 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
의 크기보다 클 수 없으므로 충분한 정렬을 가짐).
표준에서 공식적으로 보장하지는 않습니다. 그러나 실제로는 이 실제로 작동합니다.
당신은'enum' 대신에'union'을 의미합니다, 맞습니까? – fredoverflow
예. 그 모범이 분명하게 나타났습니다. –
@Mehrdad VC++가 특정 기능을 지원하지 않는다고합니다. 이것이 유일한 컴파일러라고는 말하지 않습니다. –