Size: a a a

2020 September 30

I

Ioann_V in pro.cxx
Не забывай, что realloc - C / C++, при невозможности расширить текущий блок памяти, сделает копирование текущего блока памяти с раширением до нужного размера. А это, в свою очередь, может быть совсем не то, что тебе нужно. Другими словами - применимо лишь для trivially copyable типов.

Продвинутые версии STL-Like контейнеров, типа Библиотеки Facebook Folly - содержат свою реализацию класса vector, работающего со специальным аллокатором и функцией realloc, отличной по поведению от той, что предоставляет стандарт языка C:

Появляется возможность спросить у аллокатора, а может ли он расширить текущий блок памяти, и если да, то на сколько. Если нет, то, соответственно мы можем либо скопировать данные в новое место, либо переместить их. Как никак, а где-то в плане Performance, это может давать свои ощутимые плюсы.

#cxx #performance #memory #allocator
источник

АР

Андрей Руссков... in pro.cxx
Anatoly Tomilov
речь про то, что можно сделать так, чтобы вектор рос вообще без перемещений и перекопирований содержимого в моменты реаллокации
в общем случае нельзя
источник

AT

Anatoly Tomilov in pro.cxx
Андрей Руссков
в общем случае нельзя
это изъян стандарта? Это принципиально нельзя предусмотреть было или просто не подумали?
источник

АР

Андрей Руссков... in pro.cxx
это изъян интерфейса realloc'a. Нужен какой-нить realloc_if_in_place, с fallback'ом на старый вариант в случае если in place не удалось
источник

АР

Андрей Руссков... in pro.cxx
иначе ты не сможешь переместить старые объекты в новый блок памяти
источник

АР

Андрей Руссков... in pro.cxx
однако реализовать расширение вектора через realloc для тривиальных типов можно уже сейчас, и думаю реализации должны это сделать
источник

АР

Андрей Руссков... in pro.cxx
* офк если системный аллокатор умеет в realloc
источник

AT

Anatoly Tomilov in pro.cxx
Андрей Руссков
это изъян интерфейса realloc'a. Нужен какой-нить realloc_if_in_place, с fallback'ом на старый вариант в случае если in place не удалось
я не хочу использовать realloc. Я какое-нибудь спецAPI для работы с виртуальной памяти заюзаю и сделаю кастомный аллокатор (в смысле стандартной библиотеки, а не тот, что malloc free)
источник

M

Mind in pro.cxx
Ну стандартную либу c++ никто не заставляет realloc использовать вроде. Другой вопрос что так все делают
источник

АР

Андрей Руссков... in pro.cxx
Anatoly Tomilov
я не хочу использовать realloc. Я какое-нибудь спецAPI для работы с виртуальной памяти заюзаю и сделаю кастомный аллокатор (в смысле стандартной библиотеки, а не тот, что malloc free)
там где-то было предложение поддержать расширение в аллокаторах
источник

AT

Anatoly Tomilov in pro.cxx
Андрей Руссков
это изъян интерфейса realloc'a. Нужен какой-нить realloc_if_in_place, с fallback'ом на старый вариант в случае если in place не удалось
имею ввиду Allocator в std::vector<T, Allocator>
источник

АР

Андрей Руссков... in pro.cxx
ну да, я понял
источник

АР

Андрей Руссков... in pro.cxx
проблема в том, что непонятно какой должен быть интефейс у Allocator, поддерживающего realloc
источник

OZ

Olzhas Zhumabek in pro.cxx
источник

I

Ioann_V in pro.cxx
Андрей Руссков
проблема в том, что непонятно какой должен быть интефейс у Allocator, поддерживающего realloc
Разве умения спросить сколько там в линии осталось - недостаточно?
источник

АР

Андрей Руссков... in pro.cxx
это может занимать время, сравнимое с новой аллокацией )
источник

AT

Anatoly Tomilov in pro.cxx
да, я бы предложил size_t Allocator::capacity() добавить
источник

I

Ioann_V in pro.cxx
++
источник

I

Ioann_V in pro.cxx
и не важно сколько времени займет
источник

АР

Андрей Руссков... in pro.cxx
Anatoly Tomilov
да, я бы предложил size_t Allocator::capacity() добавить
тогда уж max_capacity, но это не то немного
источник