In seiner Spalte Guru Of The Week #28 verwendet Herb Sutter eine Union, aber sie ist weniger robust als Boosts Bemühungen.
Boost's aligned_storage löst die blutigen Details für Sie. Wenn Sie sich die Implementierung ansehen, werden Sie MSCVs __alignof
oder GCCs __alignof__
sowie eine andere Vorlage sehen: type_with_alignment
.
Aus meiner eigenen Code-Basis, ich einmal verwendet (von der GOTW Link oben abgeleitet):
#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 diesen Tagen ich würde nur auf Boost-verlassen, da es wahrscheinlich viele mehr Eckfällen und Compiler Besonderheiten abdeckt
Interessante Frage. +1 um sich daran zu erinnern, den Destruktor manuell zu treffen (obwohl ich etwas verwirrt bin, wie du es durch eine 'const' machst. Ich muss wirklich auf meine 'const'-Platzierungen auffrischen). – WhozCraig
@WhozCraig: Danke. Beachten Sie, dass der Zeiger nicht const ist, der Zeiger selbst ist. :) – Mehrdad
Ja, das habe ich gerade gesehen. = P –
WhozCraig