सामान्य (पोर्टेबल) समाधान 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
पर्याप्त है। (यह निश्चित रूप से इंटेल और स्पार्क पर पर्याप्त है।)
कुछ चरम मामलों में, इसका परिणाम से अधिक मेमोरी आवंटित करने के परिणामस्वरूप हो सकता है, उदा। यदि 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' के बजाय 'संघ' है, है ना? – fredoverflow
हां। उदाहरणों ने स्पष्ट किया, मुझे उम्मीद है। –
@ मेहरदाद यह कहता है कि वीसी ++ एक निश्चित सुविधा का समर्थन नहीं करता है। यह नहीं कहता कि यह एकमात्र कंपाइलर था। –