Комментарии 12
Аллокатор был фактически частью стандарта
Нет у раста стандарта)) Ну да ладно, это мелочи. Когда уже завезут не глобальные аллокаторы, а отдельно под каждый контейнер? Мне вот совсем не нужно bump allocator для всей программы)
Вам тогда в zig надо. Там аллокаторы везде с собой таскают :)
А вот после полного очищения (
clear()), вектор освободил буфер, и аллокатор зафиксировал 0 байт занятых.
Что-то тут не так: по описанию Vec::clear
Clears the vector, removing all values.
Note that this method has no effect on the allocated capacity of the vector.
Поэтому после вызова v.clear() должны были остаться те же 800 байт. Предполагаю, что это компилятор вставил drop(v) сразу после вызова v.clear() и перед println.
Честно говоря, на плейграунде поведение у этого кода "несколько отличается":
Через наш аллокатор выделено 948 байт
После partial free осталось занято 1972 байт
После очистки вектора занято 1972 байтя пока слишком глубоко не копал с вектором в Расте всмысле не всматривался в цифры выделений - сужу визуально покачто чисто и смотрю на скорость своего алгоритма, там помимо двух выделений вектора расчеты, хотел побыстрее, в итоге я через слайсы ушёл от пушей в вектора, но то всё проверять надо, это в связке с clear() -> reserve -> расчет -> определяем длину, далее берем текущую ячейку, делаю слайс, и по индексу вставляю
а создаю с капасити
где-то на 2мс сократилось, хотя тут компромиссы, слайс тоже не бесплатный походу например на своём типе будет нужен Clone, без этого на 0.5-1мс больше(по времени этой функции), без релиза около 6мс
забыл сказать, что у меня размер максимальный всегда фиксированный, под маску u8; 4096, в одном векторе максимум около 100к u32, в другом около 70к, компилирию с -lto -O3, помимо прочего, + cargo run --release и некоторые критичные функции inline always
тоесть бывает так, что выделение узкое горлышко, ведь бывает надо не просто выделить, а выделить, но перед этим что-то долгое посчитать с переходами выборами и расчетами
Свой глобальный аллокатор нужен очень редко. До тех пор, пока нет возможности передать ему хотя бы пул, из которого хочется выделить память. На МК это было бы очень востребовано.
Всё, что нужно знать про аллокаторы в Rust (и как написать свой)