通常の(ポータブル)ソリューションは、ビルトインタイプ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
に1つまたは2つしか含まれていない場合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++は特定の機能をサポートしていないと言います。これが唯一のコンパイラであるとは言いません。 –