@ProCxx

Страница 2312 из 2477
Соломончик
31.08.2018
07:14:00
чтобы c_str() реализовать
Ну хз, зачем хранить \0, если его просто потом можно добавить?

yuri
31.08.2018
07:14:01
для коротких строк и правильного кода (который не полагается на c_str()) вполне решение.

Matwey
31.08.2018
07:14:28
Ну хз, зачем хранить \0, если его просто потом можно добавить?
Ну не так то просто его "потом добавить", учитывая что область памяти должна быть непрерывная.

Nikita
31.08.2018
07:15:14
Google
Kirill
31.08.2018
07:15:45
Ну хз, зачем хранить \0, если его просто потом можно добавить?
c str как и data возвращает просто указатель. как можно узнать куда добавить, если в функцию пришел указатель на си стайл, но не нуль терминированную строку

Плюс для маленьких строк нуль терминатор не занимает место, в него превращается последний байт, который счетчик свободных байт в small string optimization

Соломончик
31.08.2018
07:19:10
(( нельзя скрины слать

Alexander
31.08.2018
07:19:19
Соломончик
31.08.2018
07:19:20
http://www.cplusplus.com/reference/string/string/c_str/

Alexander
31.08.2018
07:19:34
http://www.cplusplus.com/reference/string/string/c_str/
не пользуй этот сайт - пользуй cppreference

Kirill
31.08.2018
07:19:38
А если строка меньше порога, то буффер для small string уже есть, почему в его неиспольуеемый конец 0 не положить. Если больше чем размер small string то оверхед максимум в 1 вроде 23 (тут могу ошибаться) это не оверхед

Kirill
31.08.2018
07:20:37
По-идее на такое должны ругаться статические анализаторы
Да это хак, но он такой милый) есть доклад с cpp con пол стринг в фейсбуке, там про это все рвсказывается. Очень хороший доклад

Matwey
31.08.2018
07:20:50
У меня вопрос был по SSO

Kirill
31.08.2018
07:21:36
что такое 23?
Размер small string, но точное число я не помню по этому взял из дырявой памяти с дисклеймером. Судя по тому что ты спросил, я точно ошибся)

Google
yuri
31.08.2018
07:21:50
Тот самый доклад: https://www.youtube.com/watch?v=kPR8h4-qZdk

Matwey
31.08.2018
07:21:51
Я вот научным методом вычислил, что 90% моих строк меньше 58 байт. Я согласен, чтобы каждый объект std::string занимал чуть больше 58 байт, но чтобы не ходил в аллокатор каждый раз. Как мне это сделать?

Kirill
31.08.2018
07:22:11
Тот самый доклад: https://www.youtube.com/watch?v=kPR8h4-qZdk
Вот оно, спасибо , очень крутой доклад

Spoonson
31.08.2018
07:22:24
Alexander
31.08.2018
07:22:31
в libc++ чуточку сложнее

Spoonson
31.08.2018
07:22:43
23 это теоретический максимум SSO

Alexander
31.08.2018
07:24:20
нет, все верно. https://github.com/elliotgoodrich/SSO-23 на 64 битной sizeof строки будет 24 байта
хм, спасибо за ссылку. Там в исходниках libc++ не так просто было раскопать, какого размера буфер под SSO

Matwey
31.08.2018
07:24:40
Ну я короче намекаю на то, чтобы как-то отрегулировать размер SSO добавив просто принудительно запас пустого места.

Alexander
31.08.2018
07:25:15
Плохо сделали
ну ты как бы можешь подсунуть свой аллокатор ?

Matwey
31.08.2018
07:25:47
Ну это понятно

Nikita
31.08.2018
07:26:15
Плохо сделали
с трудом представляю как такое реализовать. Если шаблонный параметр , то тогда в проекте будет 100500 строк разного типа

Spoonson
31.08.2018
07:27:53
почему же 100500? просто два вида строк - с большим SSO и обычным. Вряд ли будет желание много разных размеров SSO иметь.

Nikita
31.08.2018
07:29:38
почему же 100500? просто два вида строк - с большим SSO и обычным. Вряд ли будет желание много разных размеров SSO иметь.
А потом Петя захотел со "средним" А ещё как мувать такие строки одни в другие? Забавно будет во время мува словить реаллокацию)

Google
Nikita
31.08.2018
07:47:18
Нет
я тут подумал судя по cppreference, у c_str сложность константная - значит трюк с lazy \0 не прокатит. Тогда каким образом такой код: str.resize(10, '1'); str.c_str(); даст гарантию валидной C-строки?

Nikita
31.08.2018
08:05:04
Nikita
31.08.2018
08:05:40
Стандарт гарантирует
Ура пасиба :) Не умею я в нём ориентироваться, только cppreference читаю

Anatoly
31.08.2018
08:06:17
Я не очень понял, что ты в итоге хочешь получить

c_str гарантированно возвращает нуль терминированную строку

Какие гарантии тебе еще нужны?

Max
31.08.2018
08:08:27
Какие гарантии тебе еще нужны?
вопрос не "какие", а "каким образом". Откуда берётся в конце 0, если resize не выделяет дополнительный элемент, а c_str - константной сложности.

Nikita
31.08.2018
08:08:47
c_str гарантированно возвращает нуль терминированную строку
Ну вот Илья говорит, что resize не выделяет место под \0. Если это действительно так, каким образом тогда ```str.resize(10, '1'); str.c_str();``` даст валидную C-строку при условии, что c_str не переаллоцирует память (ибо сложность у него константнаыя)

Igor
31.08.2018
08:12:17
Resizes the string to contain count characters. If the current size is less than count, additional characters are appended. If the current size is greater than count, the string is reduced to its first count elements. нет никакого запрета на то, чтобы при resize(n) делать на самом деле resize(n+1) и пихать в конец 0, ибо это самый простой способ добиться нуль-терминированных строк в c_str() за O(1)

Max
31.08.2018
08:12:31
Anatoly
31.08.2018
08:12:41
В первую очередь, я хочу узнать, чем поможет в жизни знание того или иного устройства стринга при написании прикладного кода. Опираться надо в любом случае на спек

yuri
31.08.2018
08:13:35
str.resize(10, '1'); — это короткая строка. Там \0 будет в пределах структуры.

Google
Nikita
31.08.2018
08:14:04
В первую очередь, я хочу узнать, чем поможет в жизни знание того или иного устройства стринга при написании прикладного кода. Опираться надо в любом случае на спек
Да блин я хочу выделить буффер под WINAPI вызов так, чтобы этот вызов в итоге не затёр потенциальное место, зарезервированное под \0 :) а выделять лишнего не охота

yuri
31.08.2018
08:14:44
да блин ну resize(100500, '1')
Тебе ответили, что от реализации зависит.

Nikita
31.08.2018
08:15:07
Вектор тебе в помощь
мне наружу string надо отдать

Anatoly
31.08.2018
08:15:42
Nikita
31.08.2018
08:16:29
А отдавай стринг
а вот нету способа перетащить данные из вектора в стринг без реаллокации

Igor
31.08.2018
08:17:17
мне наружу string надо отдать
str.reserve(n+2) чтобы прям ваще точно хватило

Nikita
31.08.2018
08:18:06
Может тебя легче пристрелить?
а может лучше пристрелить дядек из комитета, которые не придумали конструктора, который позволяет завладеть переданным указателем?

ух бомбит уже у меня чё то с дизайна stl

yuri
31.08.2018
08:19:34
ух бомбит уже у меня чё то с дизайна stl
там еще у c_str() сигнатура const char*. Куда говоришь, ты будешь указатель передавать?

Anatoly
31.08.2018
08:20:09
ух бомбит уже у меня чё то с дизайна stl
Тебя бомбит от того, что будет выделен один лишний байт? А ты в курсе, что хип менеджер работает с точностью до размера страницы и там ни о каком размере с точностью до байта не идет

Igor
31.08.2018
08:20:19
но зачем когда есть .data

а, пардон, неконстантная дата есть только с 17 стандарта

Google
Grigor
31.08.2018
08:20:40
но зачем когда есть .data
они ж с 11го стандарта одинаково себя ведут

Anatoly
31.08.2018
08:22:56
хочется красиво
Теряешь время на ерунду

Nikita
31.08.2018
08:23:26
Теряешь время на ерунду
А вот тут соглашусь

Ruslan
31.08.2018
08:29:49
Ребята, я ж правильно понимаю, что когда зову у std::string resize(n), то памяти выделяется n + 1 (для хранения \0)?
Неясно. В стандарте только лишь говориться о том, что такое size и как он меняется при resize. Про аллокацию памяти в детялях не описано. Возможно, это оставлено на откуп автору STL

Этго стандартная практика больших компаний

Ну, раньше точно это было в тренде. Теперь, возможно, слегка поменялось что-то

Igor
31.08.2018
08:31:38
так емуж не столько строки сколько векторы нужно переписать

Nikita
31.08.2018
08:31:53
Ага прям представляю очередной митинг в понедельник PM: ну чё там у тебя с задачей Я: ну... я переписываю std::string...

Ruslan
31.08.2018
08:32:04
Зачем же полумеры?

Скажешь, что переписываешь STL

Matwey
31.08.2018
08:35:27
Господа, а кто разбирается в pthreads?

Объясните, что за история с PTHREAD_PRIO_INHERIT плиз

Ну или где объясняется общая картина

Ilia
31.08.2018
08:36:26
Объясните, что за история с PTHREAD_PRIO_INHERIT плиз
Такой же, как у создающего потока

Matwey
31.08.2018
08:37:19
Т.е. что? Приоритет потока меняется в зависимости от того взял ли он мютекс или нет? Или как?

Ilia
31.08.2018
08:37:23
Но это не точно, проверь по документации

Страница 2312 из 2477