Igor
как бы разные адреса Schedule 0x7ffe4887b67f Schedule 0x7ffe4887b67f Schedule 0x7ffe4887b67f Take 0x1287c30 Execute 0x1287c30 Take 0x1287c31 Execute 0x1287c31 Take 0x1287c32 Execute 0x1287c32
Andrey
push_back(T&&)
Egor
Есть два range-loop. for (auto& a : b) и for (auto&& a : b). http://coliru.stacked-crooked.com/a/3076969a7943976f http://coliru.stacked-crooked.com/a/3c5019e1663ddcfe В чем разница и когда полезно?
Говорят, что практически ничем не отличаются, за исключением экзотических случаев вроде "код не компилируется с auto&, потому что итератор возвращает rvalue прокси-объект вроде vector<bool>::iterator" https://stackoverflow.com/questions/13130708/what-is-the-advantage-of-using-universal-references-in-range-based-for-loops
Egor
push_back(T&&)
Для этого надо, чтобы переданный параметр был rvalue. Job&& job_ не является rvalue. Это lvalue.
Andrey
Да, я вижу теперь о чем ты. Сейчас посмотрю куда и что копируется
Andrey
Да, без std::move там копирование
Andrey
Спасибо, поправлю 😉
Andrey
http://coliru.stacked-crooked.com/a/9ecb10f0c0d59eaf
Andrey
теперь все мувится
Andrey
кстати, почему вектор не делает мув объектов при реаллокации буфера?
Andrey
отлично!
Vsevolod
объекты noexcept быть не могут, а вот их move конструктор должен быть таким
Vsevolod
а правда, что std::vector не использует realloc?
Andrey
теперь все мувится
Egor
а правда, что std::vector не использует realloc?
Кажется, что скорее да, потому что такой операции в стандартных аллокаторах не имеется.
Vsevolod
вот ведь жопа
Vsevolod
realloc во многих аллокаторах вообще zero cost
Vsevolod
в ряде случаев, конечно
Pavel
это какието магические аллокаторы без фрагментации?
Vsevolod
при чем тут магия?
Pavel
нафига вообще вам вектор в большинстве случаев? почему не дек?
Vsevolod
когда ты просишь аллокатора память, он запросто может выделить тебе больше памяти
Vsevolod
дек тормоз, ты чего
Vsevolod
в общем, читаю уже https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md
Andrey
в общем, читаю уже https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md
еще https://github.com/facebook/folly/blob/master/folly/docs/small_vector.md
Vsevolod
ну да, похоже, придется кусочки этого folly себе втягивать, когда буду на плюсы переходить
Vsevolod
потому что иначе смысла как-то маловато
Vsevolod
хеш таблицы стандартные тоже сосут :(
Berkus
у вектора есть reserve() если что
Pavel
дек тормоз, ты чего
зато без релокейтов
Vsevolod
reserve применим не всегда
Pavel
в фбвекторе не увидел чегото особого от реаллока
Pavel
тот же memcpy/memmove упоминают
Pavel
не вижу разницы с move от с++
Ioann_
На винде тестил ?
Pavel
или с++ это делает поэлементно?
Vsevolod
https://github.com/facebook/folly/blob/master/folly/FBVector.h#L1603
Ioann_
или с++ это делает поэлементно?
При любых раскладах выгоднее написать свой мув
Ioann_
На интринсиках
Ioann_
И с префетчингом
Pavel
или с++ это делает поэлементно?
если нет, то семантику noexept в move-конструкторе они поменяли на IsRelocatable. не вижу разницы опять
Pavel
https://github.com/facebook/folly/blob/master/folly/FBVector.h#L1603
if there is a possibility == если нет фрагментации. я правильно понимаю?
Pavel
ну если один вектор на всю программу то да, повезет, наверное. а так — не вижу разницы с reserve
Vsevolod
для reserve ты должен сам рассказать свои предположения о размере
Vsevolod
а тут он спрашивает аллокатор
Vsevolod
это удобно
Vsevolod
я с jemalloc делаю точно также
Pavel
а тут аллокатор угадывает за тебя
Pavel
я блин не вижу разницы между скрытыми дырами которые делает аллокатор и стретегией выделения памяти обычным вектором
Vsevolod
нет, аллокатор знает, из какой зоны у тебя чанк памяти, и нет ли за этим чанком еще свободных
Vsevolod
плохо, что не видишь, а я, вот, вижу
Vsevolod
и бенчмарки тоже делал
pavel
И с префетчингом
Это уже не C++
Pavel
дак их там не будет почти всегда
Pavel
и бенчмарки тоже делал
синтетические тесты тут не подходят
Vsevolod
хотя не сказать, что безумный прирост производительности - копирование нынче не такая дорогая операция, да и аллокатор не всегда укладывается в оптимальный паттерн
Pavel
стретегия выделять в N раз памяти больше вполне себе ок
Vsevolod
не всегда знаешь, сколько нужно памяти
Ioann_
и бенчмарки тоже делал
На какой ОС бенчамарки делал то ?
Vsevolod
в N раз больше чего?
Ioann_
Каким компилятором ?
Vsevolod
при чем тут компилятор, когда это зависит от аллокатора
Vsevolod
в моем случае jemalloc и его метод nallocx
Ioann_
Просто под каждую ось разные компили
Ioann_
Так на какой ты тестировал и какой профит вышел ?
Vsevolod
понятия не имею, какой-то свежий gcc и какой-то свежий linux
Vsevolod
gcc version 7.2.0 (Ubuntu 7.2.0-8ubuntu3) видимо, только это вообще не связано с темой разговора
Ioann_
Тогда фигня дело. На винде было бы интересно о профитах fbvector на std vector послушать
Vsevolod
а мне - неинтересно
Pavel
не всегда знаешь, сколько нужно памяти
нуда. вот этот слишком умный аллоктор будет колупаться в памяти каждый раз, вместо того чтобы просто перераспеределить. на мелких векторах перераспределение будет незаметно, а для больших векторов он не найдет себе такую дыру никогда
Vsevolod
вот именно на мелких и будет прирост - вместо удвоения с копированием пары байт просто возвращать больший кусок памяти
Vsevolod
но, как уже заметили выше, reserve(128) решает эту проблему, хотя и не бесплатно
Pavel
да что за приложения вы такие пишите где вам надо много непрерывных блоков элементов в памяти. возьмите дек, можетбыть?