Size: a a a

2020 July 16

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
Если делать SBO так: template<typename T, size_t N> class small_vector { std::variant<std::array<T, N>, std::vector<T>> m_data; public : /*mimic container*/ };, то это нормальная идея? Или какие-то серьёзные проблемы можно встретить на пути?
array потребует от T множество свойств, типа default constructible
источник

AT

Anatoly Tomilov in pro.cxx
Александр Караев
array потребует от T множество свойств, типа default constructible
действительно
источник

AT

Anatoly Tomilov in pro.cxx
а dynarray не завезли, кажется
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
а dynarray не завезли, кажется
static_vector это называется обычно
источник

АК

Александр Караев... in pro.cxx
ну и да, small_vector = variant<static_vector, vector>
источник

AT

Anatoly Tomilov in pro.cxx
да. dynarray мимо
источник

m

magras in pro.cxx
Anatoly Tomilov
а dynarray не завезли, кажется
std::unique_ptr<T[]>?
источник

D

Dmitriy in pro.cxx
Скорее что-то вроде array<optional<T>, N>
Хотя выглядит немного костыльно
источник

AT

Anatoly Tomilov in pro.cxx
static_vector можно, наверное, реализовать через std::vector с кастомным аллокатором, который содержит в себе std::aligned_storage для N элементов типа T и в конструкторе единожды делать reserve(N);, чтобы избежать аллокаций кроме единственной?
источник

AT

Anatoly Tomilov in pro.cxx
Dmitriy
Скорее что-то вроде array<optional<T>, N>
Хотя выглядит немного костыльно
optional убьёт contiguous container
источник

AN

Alexander N in pro.cxx
Anatoly Tomilov
optional убьёт contiguous container
Дак там же union внутри не?
источник

AT

Anatoly Tomilov in pro.cxx
Alexander N
Дак там же union внутри не?
там же bool рядом
источник

AT

Anatoly Tomilov in pro.cxx
ну или по крайней мере 1 байт
источник

AT

Andrew Titov in pro.cxx
Alexander N
Дак там же union внутри не?
Это уже variant.
источник

AT

Anatoly Tomilov in pro.cxx
Andrew Titov
Это уже variant.
optional тоже через union реализуют
источник

АК

Александр Караев... in pro.cxx
Anatoly Tomilov
static_vector можно, наверное, реализовать через std::vector с кастомным аллокатором, который содержит в себе std::aligned_storage для N элементов типа T и в конструкторе единожды делать reserve(N);, чтобы избежать аллокаций кроме единственной?
имхо, есть смысл на аллокаторе сразу делать small_vector
источник

AT

Anatoly Tomilov in pro.cxx
по крайней мере один из способов. union с empty struct
источник

AT

Anatoly Tomilov in pro.cxx
Александр Караев
имхо, есть смысл на аллокаторе сразу делать small_vector
тоже к этой мысли пришёл
источник

AT

Anatoly Tomilov in pro.cxx
Anatoly Tomilov
по крайней мере один из способов. union с empty struct
других способов кажется и нет, чтобы сделать constexpr
источник

AT

Andrew Titov in pro.cxx
источник