11 Eylül 2017 Pazartesi

std::aligned_storage

Giriş
Sanırım en çok placement new ile kullanır.

Tanımlama
Şöyle yaparız.
typename std::aligned_storage<sizeof(T) + 1, alignof(T)>::type bytes_{};
Örnek
Elimizde move işlemini destekleyen bir yapı olsun.
struct moveonly {
  int x;
  moveonly(int x) noexcept : x(x) {}
  moveonly(moveonly&& o) noexcept : x(o.x) { o = {-1}; }
  moveonly& operator=(moveonly o) noexcept {using std::swap; swap(x, o.x); return *this;}
};
Bir bellek alanı oluştururuz.
std::aligned_storage<sizeof(moveonly), alignof(moveonly)>::type buffer;
moveonly* extracted = reinterpret_cast<moveonly*>(&buffer);
Elimizde bir iterator olsun. Şöyle yaparız.
std::aligned_storage<sizeof(moveonly), alignof(moveonly)>::type buffer;
moveonly* extracted = reinterpret_cast<moveonly*>(&buffer);

auto it = ...;
new (extracted) moveonly{std::move(*it)}; 


Hiç yorum yok:

Yorum Gönder