Nella colonna Guru Of The Week #28, Herb Sutter utilizza un sindacato ma è meno robusto degli sforzi di Boost.
Boost's aligned_storage risolve i dettagli sanguinosi per te. Se osservi la sua implementazione, vedrai che utilizza MSCV __alignof
o GCC __alignof__
e un altro modello: type_with_alignment
.
Dalla mia base di codice, una volta ho usato (derivato dal link GotW sopra):
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
# pragma warning(push)
# pragma warning(disable: 4371)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
union AlignedStorage
{
char storage[sizeof(T)];
int16 dummy0;
int32 dummy1;
int64 dummy2;
float dummy3;
double dummy4;
long double dummy5;
void (*dummy6)();
struct dummy7;
int dummy7::*dummy8;
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
# pragma warning(push)
# pragma warning(disable: 4121)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
int (dummy7::*dummy9)(int);
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
# pragma warning(pop)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140050215)
}; // AlignedStorage
#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
# pragma warning(pop)
#endif // #if (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 150020706)
In questi giorni vorrei solo contare su Boost in quanto probabilmente copre molti più casi d'angolo e le specificità del compilatore
fonte
2013-08-19 21:36:12
Interessante domanda. +1 per ricordare di colpire manualmente il distruttore (anche se sono piuttosto incerto su come farlo con un 'const'. Devo davvero rispolverare i miei posizionamenti' const'). – WhozCraig
@WhozCraig: Grazie. Nota che il pointee non è const, il puntatore stesso è. :) – Mehrdad
Sì, l'ho appena visto. = P –
WhozCraig