|
|
|||||||||||
resize or reserve07.07.2020, 11:07. Показов 3079. Ответов 39
Метки нет (Все метки)
Мое почтение, джентльмены.
Нужно быстро выделить буфер для работы с адресной арифметикой. И так, чтобы без ручного освобождения памяти. Был предложен след подход:
Вопрос знатокам:
Компилятор (VS2017) в режиме отладки ругается (обращение к не инициализированной строке), в релиз - все норм.
0
|
|||||||||||
| 07.07.2020, 11:07 | |
|
Ответы с готовыми решениями:
39
Разница между resize и reserve QVector::reserve() + std::vector::reserve() и добавление в начало Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()? |
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 07.07.2020, 11:18 | |||||||
Сообщение было отмечено bedvit как решение
РешениеСделай
1
|
|||||||
|
|
||||||||||||
| 07.07.2020, 12:02 [ТС] | ||||||||||||
|
oleg-m1973, спасибо.
Ранее делал так
Добавлено через 6 минут Хотя рабочий вариант через std::unique_ptr представляется целесообразным и думаю использовать его.
0
|
||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 07.07.2020, 12:08 | ||
|
Потому что нарушаются установленные стандартом условия для доступа к элементам std::string. Доступ возможен в пределах [0..size()], а вы рассчитываете на [0..capacity()] Тут все написано: https://eel.is/c++draft/basic.string
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 07.07.2020, 12:13 | ||
|
0
|
||
|
|
|||
| 07.07.2020, 12:19 [ТС] | |||
|
DrOffset, а мне не нужен доступ к к элементам std::string. Мне нужен просто кусок памяти, который потом автоматом освободится. А работать я буду через указатели char*, и функционал типовой std::string тоже не нужен.
Правильно ли я понимаю, при reserve() непрерывный кусок памяти выделен, и при выход за границы видимости, должен быть освобожден. Добавлено через 2 минуты
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 07.07.2020, 12:24 | ||
|
0
|
||
|
|
|
| 07.07.2020, 12:36 [ТС] | |
|
Согласен.
Итого, как я понял: 1. UB нет, но часть функционала std::string не работает (нужен он или нет, плохо ли это или нет - вопрос другой). 2. С учётом, что есть std::unique_ptr, первый вариант - это ненужные костыли. Всем спасибо. P.S. Судя по времени (сравнимого с std::string.resize()) std::make_unique тоже заполняет строку.
0
|
|
|
фрилансер
6466 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|
| 07.07.2020, 12:53 | |
|
bedvit, если функционал std::string таки не нужен, сделай свой класс-вроппер, внутри которого будет malloc в конструкторе и free в деструкторе
Добавлено через 3 минуты или, если это возможно, используй глобальную или статическую переменную std::string с выделенным буфером (тогда и перевыделять не придётся). Но нужно учитывать многопоточность, если присутствует
0
|
|
|
Неэпический
|
|||
| 07.07.2020, 13:01 | |||
![]()
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||
| 07.07.2020, 13:09 | |||
|
Поэтому как только кусок памяти перестает физически совпадать с валидными элементами в рамках контракта класса,то вы получаете UB. Добавлено через 1 минуту Вы похоже просто не понимаете что такое UB.
0
|
|||
|
|
||||||||
| 07.07.2020, 14:11 [ТС] | ||||||||
|
Алексей1153, думал об этом, но std::unique_ptr выглядит вполне неплохо. Такой код отрабатывает (внешне) нормально:
0
|
||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|
| 07.07.2020, 14:12 | |
|
0
|
|
|
фрилансер
6466 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|||
| 07.07.2020, 14:40 | |||
|
bedvit, к reserve можно относиться как к "настоятельной рекомендации заранее выделить память". То есть, в 99.9999% это сразу и произойдёт, но если использовать память не через функции класса, то когда-нибудь код свалится в самый радужный момент
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 07.07.2020, 15:32 | ||
|
Ассоциация UB обязательно c "падением" программы это вредная и некорректная ассоциация.
UB - это всего лишь отсутствие описанного поведения. Пока мы работаем в рамках описанного поведения, то программа ведет себя предсказуемо и переносимо - это гарантируется описанием. Если мы начинаем делать те вещи, которые вообще не описаны, или явно помечены как имеющие произвольное поведение, то мы теряем гарантии предсказуемой работы и переносимости. Естественно, потеря гарантии еще не означает обязательную поломку. Еще более на пальцах. Кликните здесь для просмотра всего текста
Вы купили телевизор, на нем написано "Не включать при влажности больше 95%". Что будет, если включить - неизвестно, в документации ничего про это не написано. Это и есть UB. Дальше вы топите баню на максимум, несете туда телевизор и включаете. Бам - работает. Ничего не произошло. По крайней мере пока. Выключили телевизор, и заявляете:
Что это значит для вас, как для пользователя? Это значит, что вы не можете в полной уверенности советовать другим ставить этот телевизор в баню. Если что - виноваты вы. Вы можете пользоваться им в том же режиме и надеяться, что все и дальше будет нормально. Но опять же, если что - виноваты вы. И все вышесказанное нисколько не означает, что не может быть такой ситуации, когда телевизор проработал в бане 30 лет, пока ее решили не снести. Какие примеры можно привести тут, чтобы доказать, что здесь UB? Да никаких. У вас может вообще не быть примеров отрицательного поведения. Но это ничего не меняет. Единственным и полным доказательством наличия UB является явное указание этого в документации или отсутствие в ней упоминаний о поведении в рассматриваемом случае.
0
|
||
|
фрилансер
6466 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|
| 07.07.2020, 16:08 | |
|
bedvit,
так ведь - https://www.cyberforum.ru/post14071034.html и там же https://www.cyberforum.ru/post14071337.html
0
|
|
|
|
|||||||
| 07.07.2020, 16:48 [ТС] | |||||||
|
Алексей1153, ну так это malloc и calloc. Под капотом new. разве не malloc. пишут что разница небольшая.
Протестировал
new[] + delete[]: 36178941 Добавлено через 1 минуту
0
|
|||||||
|
фрилансер
6466 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,128
|
|
| 07.07.2020, 16:51 | |
|
bedvit, даже так... Ну, я не знаю тогда, в чём тут фокус
0
|
|
| 07.07.2020, 16:51 | |
|
Помогаю со студенческими работами здесь
20
How can I resize all controls or just resize the space between them?
Реализация функций reserve и clear для вектора Обмен валют Яндекс-деньги и Liberty Reserve Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|