Vitaliy ◀️TriΔng3l▶️
Зачем reserve увеличивать size
Понятно, что незачем, но хотелось бы что-то между reserve и resize
Ignat
Всё ещё непонятно
Ignat
Ну то есть у каждого есть вполне понятная семантика
Vsevolod
@antoshkka взаимодействие с аллокаторами и невозможность управления поведением SSO
Vitaliy ◀️TriΔng3l▶️
А то приходится порой, например, в циклах с разными значениями вызывать конструкторы элементов
Vitaliy ◀️TriΔng3l▶️
Хотя
Vitaliy ◀️TriΔng3l▶️
Это ж reserve и push_back
Vitaliy ◀️TriΔng3l▶️
Ну, плохой пример
Vitaliy ◀️TriΔng3l▶️
Но вот не хочу я вызывать два конструктора, когда так делаю
Vitaliy ◀️TriΔng3l▶️
Ну или move использовать
🐙 Antony
Как я понимаю, хочется иметь доступ к проаллоцированной памяти но не конструировать в ней value_type, а временно создать что-то своё?
Vitaliy ◀️TriΔng3l▶️
Потому что нафиг вызывать конструктор по умолчанию, если его результат всё равно затрётся следующей операцией?
Ignat
Мне вот в плюсовых аллокаторах не нравится, что они не умеют в realloc и вообще задизайнены давно и для решения странной по нынешним временам проблемы
Vitaliy ◀️TriΔng3l▶️
Ignat
Ну и соответственно тот же вектор мог бы работать эффективнее для тривиально копируемых типов
Vitaliy ◀️TriΔng3l▶️
А ещё, может быть, у меня элементы — это POD-структуры, но, допустим, с конструктором
Vitaliy ◀️TriΔng3l▶️
И я хочу их одним memcpy запихнуть в этот vector
🐙 Antony
И я хочу их одним memcpy запихнуть в этот vector
Так и происходит во всех стандартных библиотеках
Anatoly
И я хочу их одним memcpy запихнуть в этот vector
assign range вариант расчитает тебе сколько надо аллоцировать и присвоит
Vitaliy ◀️TriΔng3l▶️
Кстати, разве у push_back есть вариант с аргументами конструктору?
Vitaliy ◀️TriΔng3l▶️
Вроде нет
Vitaliy ◀️TriΔng3l▶️
Так что, тебе в любом случае придётся что-то копировать, а потом затирать
Viacheslav
emplace_back.
Vitaliy ◀️TriΔng3l▶️
emplace_back.
о, точно
Vitaliy ◀️TriΔng3l▶️
ну значит норм всё
Vitaliy ◀️TriΔng3l▶️
я забыл, как он называется, но помню, что видел что-то подобное
Vitaliy ◀️TriΔng3l▶️
но загуглил push_back и не нашёл там class… Args
Vitaliy ◀️TriΔng3l▶️
А вообще, контейнеры STL не такие уж и плохие, как я смотрю
Aidar
А зачем управлять sso?
Vitaliy ◀️TriΔng3l▶️
Но всё равно, не нравится map/unordered_map с ключом std::string
Vitaliy ◀️TriΔng3l▶️
Это же динамическое выделение для каждого ключа, нет?
🐙 Antony
Но всё равно, не нравится map/unordered_map с ключом std::string
Мапа чинится с помощью гетерогенных сравнений
Vitaliy ◀️TriΔng3l▶️
Или короткая строка всё равно как-то впихнётся в сам std::string без выделения извне?
Aidar
Ну тоесть да но ты бы и так выделел
Vitaliy ◀️TriΔng3l▶️
Как оно работает, если у тебя строка не на стеке?
Vitaliy ◀️TriΔng3l▶️
Ну я хочу ключ, допустим, char[16]
Vitaliy ◀️TriΔng3l▶️
Хотя
Vitaliy ◀️TriΔng3l▶️
Это же std::array<char, 16>
Aidar
Ну я хочу ключ, допустим, char[16]
Оно и так влезет из-за sso
Vitaliy ◀️TriΔng3l▶️
Оно и так влезет из-за sso
А до скольки байт обычно?
Aidar
ptr+size-\0
Vitaliy ◀️TriΔng3l▶️
Вообще, хочу контролировать это дело
Vitaliy ◀️TriΔng3l▶️
Иногда строчки до 16 байт, а иногда и до 128
Aidar
8+8-\0
🐙 Antony
Зависит от имплементации и разрядности платформы. От 11 до 22 байт
Vitaliy ◀️TriΔng3l▶️
8+8-\0
Совсем мало как-то
Vitaliy ◀️TriΔng3l▶️
Хотя, 22 ничего так
Vitaliy ◀️TriΔng3l▶️
Но маловато
Vitaliy ◀️TriΔng3l▶️
11 так вообще
🐙 Antony
Это бустовая имплементация на x32
Aidar
Ну чем больше объект тем больше копировать каждый раз(при перемещении)
Aidar
В си ты бы юзал указатели и даже не задумывался
🐙 Antony
Ну чем больше объект тем больше копировать каждый раз(при перемещении)
Поэтому искуственно редко когда раздувают размер класса строки. Обычно поверх указателей И capacity хранятся символы
Vitaliy ◀️TriΔng3l▶️
Копирование строки это ж не rep stosb, это lodsb, test, stosb и jmp
Vitaliy ◀️TriΔng3l▶️
Хотя, реализация может быть и совсем другой, конечно
Aidar
Что означают эти буквы? Я понимаю только цэ++
Vitaliy ◀️TriΔng3l▶️
Но тут не прокатит встроенная оптимизация для rep stosb же (но она полезна для >128 байт, до этого используется SSE, а до 32 байт — mov)
Vitaliy ◀️TriΔng3l▶️
Что означают эти буквы? Я понимаю только цэ++
Есть в x86 инструкции для работы с массивами, например, для быстрого memcpy
Vitaliy ◀️TriΔng3l▶️
Вот, допустим, у меня строка 32 байта
Vitaliy ◀️TriΔng3l▶️
Не лучше ли скопировать 4 long long вместо того, чтобы делать strcpy?
Vitaliy ◀️TriΔng3l▶️
Ну это если считать, что она выровнена
Vitaliy ◀️TriΔng3l▶️
Как бы под это тоже можно приспособить свою собственную строку
Vitaliy ◀️TriΔng3l▶️
Хотя, это уже совсем наркомания какая-то
Vitaliy ◀️TriΔng3l▶️
слишком premature optimization
Anatoly
Не лучше ли скопировать 4 long long вместо того, чтобы делать strcpy?
а с чего ты решил, что оптимизатор это не сделает за тебя?
🐙 Antony
Как бы под это тоже можно приспособить свою собственную строку
Если твой компилятор это не делает - выкинь его
Aidar
Копирование строки это ж не rep stosb, это lodsb, test, stosb и jmp
На тебя Иван Петров так повлиял? Тоже начал говорить странными буквосочетаниями
Aidar
Про векторизации в основном
Vitaliy ◀️TriΔng3l▶️
В С ещё темплейты с классами не помешали бы
кстати, кое для чего действительно не помешали бы темплейты
Vitaliy ◀️TriΔng3l▶️
и constexpr
Vitaliy ◀️TriΔng3l▶️
Или есть constexpr в C?
Vitaliy ◀️TriΔng3l▶️
Для min, max, clamp, align и подобной хрени полезны были бы
Vitaliy ◀️TriΔng3l▶️
Вообще, кстати, шаблоны для функций — это было бы замечательно