Tak, to problematyczne. Po prostu nie masz gwarancji, że pamięć jest prawidłowo wyrównana.
Podczas gdy istnieją różne sztuczki, aby uzyskać pamięć z odpowiednim wyrównaniem, najlepiej jest użyć Boost's lub C++ 0x aligned_storage
, które ukrywają te sztuczki od ciebie.
Potem wystarczy:
// C++0x
typedef std::aligned_storage<sizeof(my_class),
alignof(my_class)>::type storage_type;
// Boost
typedef boost::aligned_storage<sizeof(my_class),
boost::alignment_of<my_class>::value>::type storage_type;
storage_type storage; // properly aligned
new (&storage) my_class(); // okay
pamiętać, że w C++ 0x, za pomocą atrybutów, można po prostu to zrobić:
char storage [[align(my_class)]] [sizeof(my_class)];
Dla mnie wszystko jest w porządku. –
Nie, elipsy nie są legalne w tym kontekście ... (Podpowiedź: jeśli chcesz zapytać, czy kod jest dobrze zdefiniowany, najpierw musisz go skompilować.) – GManNickG
Daj mi proszę powiedzieć, jakie jest użycie robienia powyższej rzeczy w prawdziwym świecie pogramowania. – vrbilgi