Size: a a a

2020 June 03

A

Alex in pro.cxx
Александр Караев
а в чем отличие от string? :)
в том, что ей нельзя передать аллокатор?)
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Alex
в том, что ей нельзя передать аллокатор?)
Што
источник

АК

Александр Караев... in pro.cxx
Alex
в том, что ей нельзя передать аллокатор?)
можно, конечно
источник

m

magras in pro.cxx
Alex
из-за необходимости использовать аллокатор?
polymorphic_allocator( memory_resource* r);
источник

A

Alex in pro.cxx
Александр Караев
можно, конечно
Хм, не знал
источник

АК

Александр Караев... in pro.cxx
Artöm Bakri Al-Sarmini
Что-то с инвалидацией итераторов
именно
источник

A

Alex in pro.cxx
magras
На всякий случай уточню, что monotonic_buffer_resource ничего не выделяет, а использует memory_resource. И я не понимаю зачем он здесь вообще.
А судя по cppref, может как принимать внешний буфер, так и создавать свой, конструктор номер 3 https://en.cppreference.com/w/cpp/memory/monotonic_buffer_resource/monotonic_buffer_resource
источник

AT

Andrew Titov in pro.cxx
А можно поподробнее?
источник

АК

Александр Караев... in pro.cxx
Andrew Titov
А можно поподробнее?
std::vector<T> v;
auto it = v.begin();
auto moved_v = std::move(v);
assert(it == moved_v.begin()); // will fire with SOO
источник

m

magras in pro.cxx
Alex
А судя по cppref, может как принимать внешний буфер, так и создавать свой, конструктор номер 3 https://en.cppreference.com/w/cpp/memory/monotonic_buffer_resource/monotonic_buffer_resource
По-моему вы натягиваете сову на глобус. monotonic_buffer_resource предназначен для совсем других целей.
источник

АК

Александр Караев... in pro.cxx
Александр Караев
std::vector<T> v;
auto it = v.begin();
auto moved_v = std::move(v);
assert(it == moved_v.begin()); // will fire with SOO
стандарт говорит, что при муве вектора итераторы не могут инвалидироваться.
реализация Small Object Optimization нарушает это правило
источник

АК

Александр Караев... in pro.cxx
а в строке реализовано SSO, так как там нет таких гарантий
источник

A

Alex in pro.cxx
magras
По-моему вы натягиваете сову на глобус. monotonic_buffer_resource предназначен для совсем других целей.
Для каких?
Я вдохновляюсь этим примером: https://www.youtube.com/watch?v=q6A7cKFXjY0
источник

AT

Andrew Titov in pro.cxx
Александр Караев
стандарт говорит, что при муве вектора итераторы не могут инвалидироваться.
реализация Small Object Optimization нарушает это правило
источник

АК

Александр Караев... in pro.cxx
Александр Караев
стандарт говорит, что при муве вектора итераторы не могут инвалидироваться.
реализация Small Object Optimization нарушает это правило
vector( vector&& other ) noexcept;
After container move construction (overload (7)), references, pointers, and iterators (other than the end iterator) to other remain valid, but refer to elements that are now in *this

basic_string( basic_string&& other ) noexcept;
< комментария нет >
источник

CD

Constantine Drozdov in pro.cxx
Александр Караев
std::vector<T> v;
auto it = v.begin();
auto moved_v = std::move(v);
assert(it == moved_v.begin()); // will fire with SOO
Нет, а вот с указателями беда
источник

CD

Constantine Drozdov in pro.cxx
То есть можно придумать настолько извращенский итератор, что это сработает при SOO
источник

m

magras in pro.cxx
Alex
Для каких?
Я вдохновляюсь этим примером: https://www.youtube.com/watch?v=q6A7cKFXjY0
Это практически полный аналог отключения gc. Мы выделяем кусок памяти, каждое выделение через аллокатор просто увеличивает указатель. Освобождение не делает вообще ничего. Когда операция завершилась освобождаем весь кусок памяти. Это работает очень быстро, но ценой увеличенного расхода памяти.
источник

A

Alex in pro.cxx
Я понимаю
источник

A

Alex in pro.cxx
и я хотел сделать полный аналог std::vector на базе этой фичи, только не копируемый (но мувабельный). А получается, что это невозможно. И грош цена всем этим нововведениям.
источник