Max
ну это не то
Исходя из вопроса о фиксированном обьеме это как раз то
Александр
фиксированный capacity, динамический size.
Max
фиксированный capacity, динамический size.
Мне казалось, std::array только fixed size
Александр
Мне казалось, std::array только fixed size
то, что я написал - мне нужно
Александр
короче. мне нужен std::vector с аллокатором, который аллоцирует на стеке до N байт, иначе - в куче. и желательно аналогично для set, map и прочих контейнеров
Крылатый
size() там компилтаймовый.
Крылатый
Есть max_size, который говорит о максимальной вместимости в зависисомсти от реализации.
Александр
но так как это невозможно реализовать на аллокаторах со стандартными контейнерами, то нужны какие-то другие решения, типа boost::small_vector
Крылатый
Т.е. ограничения конкретной реализации
Александр
Есть max_size, который говорит о максимальной вместимости в зависисомсти от реализации.
перечитай мои сообщения, std::array здесь не в тему. у него capacity = size и он не может залезть в кучу при size > capacity (хотя бы из-за того, что size фиксированный)
Александр
хорошо, не совсем корректно изначально написал, каюсь
Александр
поискал small_map/small_set - не нашёл
Александр
flat_map нашёл, но это вроде бы не то
Крылатый
http://www.boost.org/doc/libs/1_60_0/doc/html/boost/container/small_vector.html
Александр
да small_vector-то я нашёл
Александр
впрочем, есть подозрение, что map/set на небольших объемах будут тупо медленнее vector'а с линейным поиском по нему
Alexander "SonnySlave"
У всех разное мнение о том, какой размер надо на стеке держать, а какой уже в куче. Особенно это мнение различается для серверных приложений и для embedded
Ну я тоже придерживаюсь такого мнения. Вот и думаю добавить такой параметр. Только не как в бусте (минимальный и максимальный размер на стеке), а просто максимальный
Alexander "SonnySlave"
🐙 Antony
Кто-нибудь работал с Boost.Multiprecision? Там довольно интересная штука - cpp_int_backend. Как Вы думаете, важно ли для длинной арифметики иметь ручку для настройки вида "если размер меньше чем X, аллоцируем на стеке. Если больше, то на кучу"?
Я еще раз подумал: на случай динамической аллокации класс должен хранить size, data, capacity. На 64 битной платформе это значит что можно хранить как минимум 2^128 без динамических аллокаций используя SSO. Возможно что дополнительные шаблонные параметры могут усложнить класс, не давая особых преимуществ в большинстве случаев
Torteek
Всем здравствуйте. Хочу обратиться с правильным вопросом сборки OpenCV под Win. Нужно собрать для компилятора GCC (у меня это порт MinGW64). Делаю по статье на хабре https://habrahabr.ru/post/318846/ . Как я понимаю, весь описанный процесс соберет релиз для производства 32битных проектов. Как мне сделать для 64 битных под Windows? Вариант скачать бинарники под винду не работает - они для MS VS. Спасибо
🐙 Antony
Так если sso, то размер на стеке будет регулироваться имплементацией, а не пользователем
да, но там будет размер как минимум в два раза большей long long стоит ли заморачиваться?
Alexander "SonnySlave"
А как тогда гарантировать, что там будет sso?
Alexander "SonnySlave"
Могут и забить на это
Alexander "SonnySlave"
В той же крипте числа пожирнее будут
Matway
да, но там будет размер как минимум в два раза большей long long стоит ли заморачиваться?
Я делал такую штуку. Оно работает только в очень специфических условиях. Типа в 99.9% случаев в контейнере 0..4 элементов, и только изредка херак и мульон.
Matway
Я еще раз подумал: на случай динамической аллокации класс должен хранить size, data, capacity. На 64 битной платформе это значит что можно хранить как минимум 2^128 без динамических аллокаций используя SSO. Возможно что дополнительные шаблонные параметры могут усложнить класс, не давая особых преимуществ в большинстве случаев
Даже на 64-битной платформе никто не заставляет хранить 64-битные size и capacity. Часто ли нужно больше четырёх ярдов элементов? Я в паре 64-битных проектов полностью заменил контейнеры на 32-битные индексы и размеры, написав отдельно контейнер "большой байтовый кусок, если вдруг захотелось весь блюрей в память засунуть". Так вот, выигрыш по памяти и скорости был существенным.
Vsevolod
нет, так нельзя
Vsevolod
для размеров в платформе есть std::size_t, и баста
Vsevolod
остальное от лукавого
🐙 Antony
Жуть
Matway
А можно в числовом эквиваленте «существенный» выразить? ;)
Запишу себе как-нибудь забацать статейку. На конкретной задаче (компилятор) там был выигрыш по памяти в десятки процентов (много-много маленьких векторов). Другое дело, что в 21 веке, когда люди даже на Питоне писать не брезгуют, для оптимизации контейнеров нужна сильная мотивация.
Matway
Есть распространённое заблуждение, что на 64-битной платформе 64-битные инты не дороже, чем 32-битные. Но это не так.
username
Всем привет. Снова дурацкий вопрос, не получается указать версию, с которой слинковать приложение. На ubuntu, сначала скомпилил Boost версии 1.60, потом поставил из пакетов 1.58... и при компиляции почему-то он линкуется с 1.60. Как правильно в cmake указать, что бы использовался 1.58?
username
спасибо)
Max
Почему первый вариант метода get() работает, а второй дает ошибку компиляции? 1. https://ideone.com/OzKEtR 2. https://ideone.com/pHFIKP
Max
Это ж синглтон
MT Radio
всем привет
Max
может потому, что ты возвращаешь ссылку на темпорари объект?
откуда там временный обьект? _instance живет как поле класса
MT Radio
откуда там временный обьект? _instance живет как поле класса
инстанс да, а результат вызова функции get - нет
MT Radio
гет вернет вполне себе указатель, который по-честному сам по себе является временным и умрет при выходе из функции
MT Radio
и именно на этот временный указатель мы делаем ссылку
MT Radio
но я не запускал, и что там компилятор говорит не видел
Max
но я не запускал, и что там компилятор говорит не видел
Ну тогда сначала почитай, в чем вопрос был
Pavel
куда вам столько синглтонов?
Pavel
или это просто такое излюбленное упражнение по заталкиванию всё в шаблоны?
MT Radio
Ну тогда сначала почитай, в чем вопрос был
Никто не гарантирует, что указатель, возвращенный через гет(), будет жить. Т.е. это ошибка, которую видно глядя на код
MT Radio
угу, разименовывается временно существующий указатель.
MT Radio
есть линк на стандарт, гарантирующий такое поведение? я вот такого не помню
Max
есть линк на стандарт, гарантирующий такое поведение? я вот такого не помню
Какое такое? Ты возвращаешь ссылку на существующий обьект, он НЕ временный. Почему она должна не работать?
MT Radio
можно надеяться, что реализация компилятора будет достаточно умна, но если вдруг у тебя есть линк на стандарт — просто будет оч круто
Max
Ну из-за make_shared
MT Radio
Какое такое? Ты возвращаешь ссылку на существующий обьект, он НЕ временный. Почему она должна не работать?
согласен, получаем ссылку на мембер через временный указатель, на судьбу которого наплевать
Max
никак
Переписать и не ибаццо с шаблонами?
Александр
вообще странно, что std не предоставляет какого-нибудь класса shared_creator, которому можно прописать friend class shared_creator
Max
вообще странно, что std не предоставляет какого-нибудь класса shared_creator, которому можно прописать friend class shared_creator
Но тут отсутствие шаблона не спасает, конструктор все равно будет приватный
Max
Тогда просто создать через new и все?
Alexander "SonnySlave"
всё равно я придерживаюсь мнения, что нужно давать пользователю возможность выбирать размер буфера на стеке
Alexander "SonnySlave"
только вот не совсем понятно, что делать в случае: число стало больше буфера на стеке, аллоцируем память на куче. Потом число уменьшилось и снова вмещается на стек. и что - обратно будем копировать на стек уже?
Max
Так оно так и работат, но хочу сменить без статик переменной, т.к. с ней тесты не напишешь, потому что мне нужно на тест удалять и создавать его по своему
Alexander "SonnySlave"
а если у нас кейсы что постоянно на грани, то постоянно прыгать туда-сюда не хочется
Alexander "SonnySlave"
если SSO, то такие прыжки могут иметь место и их не исправить так просто. Если указываем размер, то просто меняем размер буфера на стеке