Дмитрий ⬡
Ты ходишь в кучу не за всем вектором, там непрерывный кусок памяти. Полезнее для кешей и оптимизации, если память есть, только инвалидация портится.
Дмитрий ⬡
Списки нужны, если "ой кто-то держит указатель на ноду, может её внезапно удалить из середины"
Aleksander
как это не за всем? При добавлении элемента надо увеличить вектор. Выделяем новый большой кусок и перекладываем содержимое старого. Перекладывание может не понадобиться если алокатор сможет пристегнуть новый кусок к старому.
Aleksander
Или я сильно упрощённо смотрю на вещи? (Никогда не приходилось лазить внутрь MMU)
Anatoly
как это не за всем? При добавлении элемента надо увеличить вектор. Выделяем новый большой кусок и перекладываем содержимое старого. Перекладывание может не понадобиться если алокатор сможет пристегнуть новый кусок к старому.
у тебя есть строгий критерий, когда вектор будет переаллоцирован, а делает он это только тогда когда size() == capacity(), а list это делает при каждом добавлении. как результат, куча фрагментов в хипе без какой-либо надежды попасть в кеш одновременно
Aleksander
а причем здесь MMU
оно позволяет тусовать память почти как угодно
Berkus
причем лист будет выделять ноды в разных кусках памяти, cache locality идет к черту
Berkus
это к делу не относится вообще никак
Berkus
к тому же P-tagged обычно только L1 кэш, остальные через MMU мапятся все равно, разницы для них никакой
Aleksander
итого, vector и подобные выигрывают потому что условно непрерывные и процу проще кешировать эту ботву. Прочие варианты сливают из-за хреновой кешируемости
Дмитрий ⬡
Дека норм (она изнутри — это набор кусков какой-то длины, так можно с обоих концов кушать и наслаждаться)
Oleg
Лучше тогда деку бзать
дэка вообще отличная штука
Oleg
наверное один из лучших стандартных контейнеров
Square
+ проблемы с aliasing reasoning у оптимизаора из-за кучи указателей
это когда "память" пересекается? или наоборот не пересекается? ну всмысле эвристики этого процесса?
Oleg
в общем, чем плюсы хороши - ты можешь выбрать то, что тебе нужно под твои задачи, а не пользоваться общим чем-то, что плохо везде
🦥Alex Fails
вроде на русише где-то валялось (если я не путаю)
Aleksander
ага, поэтому я не пользуюсь никакими контейнерами
Aleksander
безконтрольно ходят в кучу
Aidar
Ну у листа вон можно вставлять в середину без инвалидации указателей/итераторов
Oleg
и удаление, более того, когда у тебя есть вероятность частых реллокаций вектора, то тоже лучше лист.
Igor
вроде на русише где-то валялось (если я не путаю)
по-моему ещё не успели перевести, даже нормальных электронных версий на английском толком нет - только вот эта дичь на 2600 "страниц"
🦥Alex Fails
Что за чат с книгами?
это я создал как костыль, пока мы бота книжного не допишем: https://t.me/joinchat/AAAAAE1yUq2Kh6WdPCtjMA
🦥Alex Fails
имхо логично, какой на выходе ты тип хочешь получить — не ясно же
ну мб, какой-н. типа std::common_type<T1, T2>::type (вроде не ошибся с этой хренью)
Igor
это я создал как костыль, пока мы бота книжного не допишем: https://t.me/joinchat/AAAAAE1yUq2Kh6WdPCtjMA
ему бы кстати не помешали нормальные названия) а не 1kh_yuz_k_kh_yuz_t_parallel_noe_.pdf
Oleg
Как тип, который вмещает в себя int и double
в шаблонах такое приведение не работает же, емнип. У тебя сигнатура четкая: Т max(Т, Т)
Aidar
Там неочевидный <
Oleg
бгг
Vitaliy
T1<T2?
Например, да
Aidar
Тут уже были дискуссии насчёт обощенного оператора сравнения для контейнеров например
Aidar
И вроде это дикая дрисьня
Aidar
Явное лучше неявного в данном случае точно
Vsevolod
а можно легкий оффтоп: сколько сейчас примерно медианная зарплата с++ сениора в Москве?
Oleg
это очень депендс, кмк
Aidar
Короче лучше ваще никогда не определять порядок разных типов
Aidar
А макс задаёт порядок
Oleg
лолшто?
🦥Alex Fails
ему бы кстати не помешали нормальные названия) а не 1kh_yuz_k_kh_yuz_t_parallel_noe_.pdf
это я вчера с тврпикса скачал; долго рыскал в инете, только там нашел
Oleg
Разумно только в одном случае - когда твой контейнер узко заточен и оптимизирован под твой тип данных
🦥Alex Fails
а можно легкий оффтоп: сколько сейчас примерно медианная зарплата с++ сениора в Москве?
думаю, в жобс-фладе можно обсудить: https://t.me/joinchat/BYlFbEPe5gMPVQm3OwKjaA
Vitaliy
Короче лучше ваще никогда не определять порядок разных типов
Ты уже второй раз пишешь "лучше". Это субъективная оценка. Приведи пример, когда это что-то ломает.
Vitaliy
Приведи пример когда это обосновано
Я хочу узнать что больше 2.5 или 3.
Aidar
Я хочу узнать что больше 2.5 или 3.
Это частный случай, возьми пользовательские типы пж
Aidar
Абстрактные
Aidar
Я говорю что порядок разных типов не имеет смысла
RattenKong 🦧🐀🦍️
Я хочу узнать что больше 2.5 или 3.
а я хочу узнать что больше 2.5 + 2.1i или 2.5(1)
Berkus
да.
учись велосипедить тогда, иначе не выживешь
Vitaliy
а я хочу узнать что больше 2.5 + 2.1i или 2.5(1)
Здесь операция не определена математически, для моего случая определена.
Aidar
Здесь операция не определена математически, для моего случая определена.
Она не определена например в поле целых чисел, потомучто второй аргумент не входит в него
Aidar
Запись 3<5.0 я бы тоже запретил на самом деле
Vitaliy
Ладно, я не увидел аргументов. Думаю, что дискутировать дальше нет смысла.
Aidar
Аргумент - страдает банально читаемость и предсказуемость результата
Vitaliy
В каком случае ? Можно кусочек кода ?
Aidar
a::operator<(b) b::operator<(a) Могут быть определены ваще по разному семантически
Aidar
Что вернёт Макс?
Berkus
а про чо вы тут спорите?
Aidar
Хотя это противоречивость порядка
Aidar
Хз ваще как аргументировать то что порядок в общем случае неопределен
Vitaliy
а про чо вы тут спорите?
Про недостатки вот такой функции: template<typename T1, typename T2> auto max(T1 first, T2 second);
Крылатый
Её обмазать нужно коньтрактами, ИМХО.
Berkus
Её обмазать нужно коньтрактами, ИМХО.
ага, как раз собирался сказать
Aidar
Ее можно определить ну там для арифметических типов
Aidar
Для всевозможных нельзя как раз