Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
meJevin
155 / 147 / 58
Регистрация: 18.11.2015
Сообщений: 644
Завершенные тесты: 1
#1

Немного про std::string - C++

08.07.2016, 00:16. Просмотров 891. Ответов 34
Метки нет (Все метки)

Привет, читал про std::string на разных сайтах.


1. Там говорят, С++ 11 гарантирует, что std::string будет stored contiguously in memory. В этом я не сомневаюсь, но каким еще образом можно в памяти хранить std::string?

2. Говорят, что std::string на самом деле имеет null-terminator на конце. Это так? Вроде да, я в этом немного убедился в своей студии. Сделал четыре std::string'a, через цикл от 0 до size()+1 вывел все представления их символов в виде int, и да, последний символ был '\0' (в int виде просто 0).

Но все равно, некоторые говорят, что если мы имеем std::string str("hello"); и пытаемся получить доступ к желанному null-terminator'у, у нас может быть UB. Т.е. писать такое: std::cout << (int)str[str.size()] << std::endl; не стоит. Правда может быть UB?

3. Что под капотом у std::string на самом деле? Можете объяснить простым языком, если не трудно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2016, 00:16     Немного про std::string
Посмотрите здесь:

std::string, std::fstream, ошибка кучи - C++
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString. Замечательно, то же самое... ошибка при...

Немного не понимаю std::move - C++
Здравствуйте, я немного не понимаю работу кода на 150-155 строках здесь: #include &lt;iostream&gt; #include &lt;memory&gt; #include...

про std - C++
Доброго времени суток. Написал достаточно большую программу и тут понадобилось удалить файл.... прочитал в инете про функцию int remove....

std:string - C++
1. Поддерживает ли этот класс сравнение целиком строк? Каков синтаксис сравнения строк? 2. Поддерживает ли этот класс конкатенацию? Каков...

std::string - C++
Господа, подскажите где можно поглядеть методы string-a литературы никакой под рукой нет, а гуглить в лоб что-то результаттов не дает. ...

std::string - C++
Здравствуйте! У меня есть std::vector&lt;std::string&gt; Подскажите пожалуйста как быстро и красиво можно перевести i-тый элемент вектора в...

Std::string - C++
никак не пойму чем отличаются методы append и assign у std::string?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,884
Записей в блоге: 2
08.07.2016, 00:26     Немного про std::string #2
Цитата Сообщение от meJevin Посмотреть сообщение
каким еще образом можно в памяти хранить
да любым - например, в виде односвязного списка чаров.

ЗЫ1: если абстракция предоставляет внешний апи - не стоит лезть и курочить ее нутрь. Потому что завтра новый Степанов перепишет эти стринги по-другому с сохранением апи, и ваша программа, рассчитывающая на нуль-терминатор, может свалиться. Например, паскалевские строки - хранят размер в первом байте. И можно на это рассчитывать. Но тогда длина не более 255, кому-то это однажды надоело, и он стал хранить длину в первом слове - двух байтах. И кто пользовался апи - не заметили, а кто рассчитывал на реализацию - приплыли.

ЗЫ2: расположение строк строго в линейной области памяти - это хорошо. В Си. А в Яве с Шарпом решили гениально совместить это требование (само по себе необязательное - см. п 1) с иммутабельностью строк И начались ужасы от тех, кто не особо понимал, как это готовить без всяких стрингбилдеров, ибо при для иммутабельности строки при операциях (конкатенация/выделение подстроки и т.п.) копируются в новые области памяти, которые аллоцируются, и если в цикле - то долго и медленно... И из-за этой имхо странной реализации многие не желающие думать императивные программисты делают вывод о том, что иммутабельные структуры данных в функциональных языках всегда копируются и жрут память и время....
meJevin
155 / 147 / 58
Регистрация: 18.11.2015
Сообщений: 644
Завершенные тесты: 1
08.07.2016, 00:45  [ТС]     Немного про std::string #3
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Это понятно, но ведь по перформансу-то долбанет же? Поэтому лучше всего contiguously in memory, так?
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
08.07.2016, 00:48     Немного про std::string #4
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,884
Записей в блоге: 2
08.07.2016, 00:50     Немного про std::string #5
Цитата Сообщение от meJevin Посмотреть сообщение
так?
Ну вы же не вчера структуры данных узнали. Долбанет по доступу за О(1) к любому элементу, зато позволит быстро расширять с головы, в отличие от стандартных массивов. В хаскеле, например, 2 типа строк - высокоуровневые - списки чаров, низкоуровневые - байтстринги. Тот же Джоэл Спольски, когэа в Майкрософте Эксель на Сях костылил, влепил туда паскалевские строки - "поэтому Эксель такой быстрый" (С). Короче - в зависит от области применения.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 02:24     Немного про std::string #6
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Неправда ваша. В стандарте четко написано:
A basic_string is a contiguous container
Т.е. под капотом у него может быть только си-строка. (Почему не просто массив чаров без терминального нуля - тоже написано, но в требованиях к operator[], c_str() и data(), которая в c++17, кстати, станет неконстантной).
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,884
Записей в блоге: 2
08.07.2016, 02:38     Немного про std::string #7
Цитата Сообщение от avgoor Посмотреть сообщение
В стандарте четко написано
Да шел бы он, стандарт (простите за непопулярное имхо) ТС спрашивал каким еще образом можно - я ответил.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 02:39     Немного про std::string #8
Цитата Сообщение от _Ivana Посмотреть сообщение
ТС спрашивал каким еще образом можно - я ответил
Но, господин! Если:
Цитата Сообщение от _Ivana Посмотреть сообщение
Да шел бы он, стандарт
то это будет не std::string из C++.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,884
Записей в блоге: 2
08.07.2016, 02:42     Немного про std::string #9
Резонно На это мы или свой буст не стд-шный навелосипедим, или стандарт поменяем (вроде какая-то российская компания стала официальным членом комитета что-ли, и может принимать предложения от соотечественников). Или и то и другое одновременно
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 02:48     Немного про std::string #10
Цитата Сообщение от _Ivana Посмотреть сообщение
Или и то и другое одновременно
Даже если и так, std::string всегда будет содержать способ каста к си-строке "для совместимости"™. Теоретически можно сделать стринг на списках, с мутабельным массивом, и только кэшировать туда данные. Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
_Ivana
2887 / 1712 / 148
Регистрация: 01.03.2013
Сообщений: 4,884
Записей в блоге: 2
08.07.2016, 03:00     Немного про std::string #11
Цитата Сообщение от avgoor Посмотреть сообщение
всегда будет содержать способ каста к си-строке "для совместимости"™
И что? Уж каст то для совместимости можно сделать из чего угодно.
Цитата Сообщение от avgoor Посмотреть сообщение
Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
Я не знаком с авторами стл, чтобы иметь о них какое-либо мнение. Зато хорошо знаком с одним парнем, который выкинул нахрен все стл-ство (на которое молились предыдущие разрабы) из пендосского проекта, написал свои реализации и убыстрил его в несколько раз.
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 03:06     Немного про std::string #12
Цитата Сообщение от _Ivana Посмотреть сообщение
написал свои реализации и убыстрил его в несколько раз
Та же фигня. Но это - фундаментальное свойство любой техники: Любое специальное устройство всегда оптимальнее общего.
Цитата Сообщение от _Ivana Посмотреть сообщение
Уж каст то для совместимости можно сделать из чего угодно.
Вопрос цены (в смысле затрат памяти итд).
Mr.X
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 04:20     Немного про std::string #13
Цитата Сообщение от HenryDukart Посмотреть сообщение
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
Да ладно! Так-то по стандарту контейнер, например, есть массив, т.е. занимает непрерывный кусок памяти.
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
08.07.2016, 11:25     Немного про std::string #14
Mr.X, разве где-то описывается внутреннее устройство контейнера?
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 14:47     Немного про std::string #15
Цитата Сообщение от HenryDukart Посмотреть сообщение
разве где-то описывается внутреннее устройство контейнера?
Адын:
21.3.1 Class template basic_string
3 A basic_string is a contiguous container
Два:
23.2.1 General container requirements
13 A contiguous container is a container that supports random access iterators and whose member types iterator and const_iterator are contiguous iterators
Три:
24.2 Iterator requirements
24.2.1 In general
5 Iterators that further satisfy the requirement that, for integral values n and dereferenceable iterator values a and (a + n), *(a + n) is equivalent to *(addressof(*a) + n), are called contiguous iterators.
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
08.07.2016, 15:14     Немного про std::string #16
avgoor, про внутреннюю реализацию ни слова.

Добавлено через 19 минут
avgoor, ну ни слова это я загул конечно. Спасибо за такое точное определение.

Специально наперекор использование структуры массива могу предложить использование структуры список, где элементы размещаются последовательно в выделенном участке памяти (с помощью new с размещением). Конечно, никакой рациональностью тут и не пахнет, но все же.
Mr.X
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 15:41     Немного про std::string #17
Цитата Сообщение от HenryDukart Посмотреть сообщение
Mr.X, разве где-то описывается внутреннее устройство контейнера?
Ой, пардон, я вектор имел в виду.
Для него в стандарте есть требование, чтобы он в памяти был подобен массиву.
HenryDukart
122 / 122 / 35
Регистрация: 05.10.2013
Сообщений: 455
Завершенные тесты: 2
08.07.2016, 15:54     Немного про std::string #18
Mr.X, вы, наверное, про метод data().
avgoor
884 / 519 / 112
Регистрация: 05.12.2015
Сообщений: 1,464
08.07.2016, 15:58     Немного про std::string #19
Цитата Сообщение от HenryDukart Посмотреть сообщение
Специально наперекор использование структуры массива могу предложить использование структуры список, где элементы размещаются последовательно в выделенном участке памяти (с помощью new с размещением)
А указатели где хранить? В другом месте будет массив {1, 2, 3, 4, 5, ...}? Зачем? И самое главное, если список всегда располагается в памяти по последовательным адресам - такой список называется массивом.
В прочем выше я уже писал: "теоретически, можно...".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2016, 16:25     Немного про std::string
Еще ссылки по теме:

Еще немного про конструкторы обобщенных классов - C++
Пытаюсь проинициализировать объект обобщенного класса, параметром которого может выступать ссылка. #include &lt;iostream&gt; ...

Вопрос про std:: - C++
std::cout &lt;&lt; &quot;Hello, world!&quot; &lt;&lt; std::endl; а можно cout &lt;&lt; &quot;Hello, world!&quot; &lt;&lt;endl; std пространство имен... где про это...

std::string Трим - C++
Как сделать трим (вырезание из начала\конца строки лишних символов таких как пробелы, табуляции...) в std::string? Я недавно нашёл у себя в...

char* vs std::string - C++
При чтении чужих сорцов, обратил внимание, что в роли аргументов для функций/методов, как правило используются указатели на массивы чаров,...

Visual C++ 7.0 и std::string - Visual C++
вот... создал новый проект... народ подскажите проблема в моей голове или в visual-e? на gcc всё работает как положено. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3043 / 1688 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 16:25     Немного про std::string #20
Цитата Сообщение от HenryDukart Посмотреть сообщение
Mr.X, вы, наверное, про метод data().
Я про то, что элементы вектора по стандарту хранятся в массиве, а адрес первого элемента вектора указывает на начало этого массива.
Yandex
Объявления
08.07.2016, 16:25     Немного про std::string
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru