
Соломончик
31.08.2018
07:14:00

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

Matwey
31.08.2018
07:14:28

Nikita
31.08.2018
07:15:14

Google

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

Matwey
31.08.2018
07:18:13

Соломончик
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

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

Соломончик
31.08.2018
07:19:43

Alexander
31.08.2018
07:20:06

Kirill
31.08.2018
07:20:37

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

Alexander
31.08.2018
07:22:13

Spoonson
31.08.2018
07:22:24

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

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

Nikita
31.08.2018
07:23:58

Alexander
31.08.2018
07:24:20

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

Alexander
31.08.2018
07:24:59

Matwey
31.08.2018
07:25:12

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 иметь.

Alexander
31.08.2018
07:28:42

Nikita
31.08.2018
07:29:38

Google

Spoonson
31.08.2018
07:31:25

Matwey
31.08.2018
07:31:51

Ilia
31.08.2018
07:37:57

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

Max
31.08.2018
08:04:08

Nikita
31.08.2018
08:05:04

Anatoly
31.08.2018
08:05:07

Nikita
31.08.2018
08:05:40

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 не переаллоцирует память (ибо сложность у него константнаыя)

Anatoly
31.08.2018
08:09:46

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
В первую очередь, я хочу узнать, чем поможет в жизни знание того или иного устройства стринга при написании прикладного кода. Опираться надо в любом случае на спек

Max
31.08.2018
08:13:20

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

Anatoly
31.08.2018
08:13:55

Google

Max
31.08.2018
08:14:04

Nikita
31.08.2018
08:14:04

Ilia
31.08.2018
08:14:24

yuri
31.08.2018
08:14:44

Anatoly
31.08.2018
08:14:46

Max
31.08.2018
08:14:49

Nikita
31.08.2018
08:15:07

Anatoly
31.08.2018
08:15:42

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

Igor
31.08.2018
08:17:17

Anatoly
31.08.2018
08:17:35

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

yuri
31.08.2018
08:19:34

Nikita
31.08.2018
08:19:53
&str.front()

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

Nikita
31.08.2018
08:20:41

Anatoly
31.08.2018
08:22:56

Nikita
31.08.2018
08:23:26

Ruslan
31.08.2018
08:29:49
Этго стандартная практика больших компаний
Ну, раньше точно это было в тренде. Теперь, возможно, слегка поменялось что-то

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

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

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