Недавно я увидел фрагмент кода, который использовал буферы хранения для создания объектов, а затем просто поменял местами буферы, чтобы избежать накладных расходов на копирование. Вот простой пример использования целых числа:Обмен буферами хранения, содержащих размещение новых созданных объектов
std::aligned_storage_t<sizeof(int), alignof(int)> storage1;
std::aligned_storage_t<sizeof(int), alignof(int)> storage2;
new (&storage1) int(1);
new (&storage2) int(2);
std::swap(storage1, storage2);
int i1 = reinterpret_cast<int&>(storage1);
int i2 = reinterpret_cast<int&>(storage2);
//this prints 2 1
std::cout << i1 << " " << i2 << std::endl;
Это чувствует, как непредсказуемое поведение в общем случае (в частности, замены буферов, а затем доступ к объектам, как если бы они были все еще там), но я не уверен, что говорит стандарт о таком использовании хранения и размещения новых. Любая обратная связь очень ценится!
Должно быть хорошо для типов [CopyConstructible] (http://en.cppreference.com/w/cpp/concept/CopyConstructible). –
Почему бы не swap 'reinterpret_cast (storage1)' и 'reinterpret_cast (storage2)'? –
immibis
@immibis, потому что это то, что делается в оригинальной части кода. – Veritas