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

C++

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

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

08.07.2016, 00:16. Просмотров 940. Ответов 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 на самом деле? Можете объяснить простым языком, если не трудно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2016, 00:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Немного про std::string (C++):

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

Файловый поток и std::string - C++
добрый день сейчас меня немножко ввело в тупняк - из файлового потока(ifstream) нельзя прочитать по словам типа std::string? только char*...

как проинициализировать std::stack<const int> obj ( std::stack<int>{} ); - C++
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include &lt;iostream&gt; #include &lt;stack&gt; //-std=c++14...

std::filesystem && std::asio и пр - C++
Пытался найти хоть какие-то сроки включения всего этого в стандарт (так же ожидается lexical_cast, any, string_algo и т.д.) и вообщем везде...

Немного философии ООП - C++
На днях на работе возник холивар с коллегами, к правильному решению пришли только на следующий день, почитав Мейерса и Саттера (один из...

Разделить vector<string> на два vector<string> - C++
У меня есть vector&lt;string&gt; line_from_file; line_from_file.resize(N); N-некое число Когда я встречу точку &quot;.&quot; в...

34
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
08.07.2016, 00:26 #2
Цитата Сообщение от meJevin Посмотреть сообщение
каким еще образом можно в памяти хранить
да любым - например, в виде односвязного списка чаров.

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

ЗЫ2: расположение строк строго в линейной области памяти - это хорошо. В Си. А в Яве с Шарпом решили гениально совместить это требование (само по себе необязательное - см. п 1) с иммутабельностью строк И начались ужасы от тех, кто не особо понимал, как это готовить без всяких стрингбилдеров, ибо при для иммутабельности строки при операциях (конкатенация/выделение подстроки и т.п.) копируются в новые области памяти, которые аллоцируются, и если в цикле - то долго и медленно... И из-за этой имхо странной реализации многие не желающие думать императивные программисты делают вывод о том, что иммутабельные структуры данных в функциональных языках всегда копируются и жрут память и время....
0
meJevin
155 / 147 / 58
Регистрация: 18.11.2015
Сообщений: 665
Завершенные тесты: 1
08.07.2016, 00:45  [ТС] #3
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Это понятно, но ведь по перформансу-то долбанет же? Поэтому лучше всего contiguously in memory, так?
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
08.07.2016, 00:48 #4
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
0
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
08.07.2016, 00:50 #5
Цитата Сообщение от meJevin Посмотреть сообщение
так?
Ну вы же не вчера структуры данных узнали. Долбанет по доступу за О(1) к любому элементу, зато позволит быстро расширять с головы, в отличие от стандартных массивов. В хаскеле, например, 2 типа строк - высокоуровневые - списки чаров, низкоуровневые - байтстринги. Тот же Джоэл Спольски, когэа в Майкрософте Эксель на Сях костылил, влепил туда паскалевские строки - "поэтому Эксель такой быстрый" (С). Короче - в зависит от области применения.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
08.07.2016, 02:24 #6
Цитата Сообщение от _Ivana Посмотреть сообщение
да любым - например, в виде односвязного списка чаров.
Неправда ваша. В стандарте четко написано:
A basic_string is a contiguous container
Т.е. под капотом у него может быть только си-строка. (Почему не просто массив чаров без терминального нуля - тоже написано, но в требованиях к operator[], c_str() и data(), которая в c++17, кстати, станет неконстантной).
0
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
08.07.2016, 02:38 #7
Цитата Сообщение от avgoor Посмотреть сообщение
В стандарте четко написано
Да шел бы он, стандарт (простите за непопулярное имхо) ТС спрашивал каким еще образом можно - я ответил.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
08.07.2016, 02:39 #8
Цитата Сообщение от _Ivana Посмотреть сообщение
ТС спрашивал каким еще образом можно - я ответил
Но, господин! Если:
Цитата Сообщение от _Ivana Посмотреть сообщение
Да шел бы он, стандарт
то это будет не std::string из C++.
0
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
08.07.2016, 02:42 #9
Резонно На это мы или свой буст не стд-шный навелосипедим, или стандарт поменяем (вроде какая-то российская компания стала официальным членом комитета что-ли, и может принимать предложения от соотечественников). Или и то и другое одновременно
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
08.07.2016, 02:48 #10
Цитата Сообщение от _Ivana Посмотреть сообщение
Или и то и другое одновременно
Даже если и так, std::string всегда будет содержать способ каста к си-строке "для совместимости"™. Теоретически можно сделать стринг на списках, с мутабельным массивом, и только кэшировать туда данные. Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
1
_Ivana
3178 / 1794 / 153
Регистрация: 01.03.2013
Сообщений: 5,007
Записей в блоге: 2
08.07.2016, 03:00 #11
Цитата Сообщение от avgoor Посмотреть сообщение
всегда будет содержать способ каста к си-строке "для совместимости"™
И что? Уж каст то для совместимости можно сделать из чего угодно.
Цитата Сообщение от avgoor Посмотреть сообщение
Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
Я не знаком с авторами стл, чтобы иметь о них какое-либо мнение. Зато хорошо знаком с одним парнем, который выкинул нахрен все стл-ство (на которое молились предыдущие разрабы) из пендосского проекта, написал свои реализации и убыстрил его в несколько раз.
0
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
08.07.2016, 03:06 #12
Цитата Сообщение от _Ivana Посмотреть сообщение
написал свои реализации и убыстрил его в несколько раз
Та же фигня. Но это - фундаментальное свойство любой техники: Любое специальное устройство всегда оптимальнее общего.
Цитата Сообщение от _Ivana Посмотреть сообщение
Уж каст то для совместимости можно сделать из чего угодно.
Вопрос цены (в смысле затрат памяти итд).
0
Mr.X
Эксперт С++
3050 / 1695 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
08.07.2016, 04:20 #13
Цитата Сообщение от HenryDukart Посмотреть сообщение
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
Да ладно! Так-то по стандарту контейнер, например, есть массив, т.е. занимает непрерывный кусок памяти.
0
HenryDukart
123 / 123 / 35
Регистрация: 05.10.2013
Сообщений: 457
Завершенные тесты: 2
08.07.2016, 11:25 #14
Mr.X, разве где-то описывается внутреннее устройство контейнера?
1
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
08.07.2016, 14:47 #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.
0
08.07.2016, 14:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2016, 14:47
Привет! Вот еще темы с ответами:

std::defaultfloat - C++
Есть такая тема в новом стандарте как std::defaultfloat Описание: http://www.cplusplus.com/reference/ios/defaultfloat/ В стандарте...

переписать std::map - C++
Добрый вечер! Есть работающая программа, в которой используется map, все работало хорошо, но теперь немного изменились условия и объем...

Вопрос по std::map - C++
В качестве хэш-таблицы для строк (AnsiString) я использовал std::map. От таблицы мне нужно было ещё и такое свойство: я хотел иметь...

Std::function<>::target() возвращает 0 - C++
Привет! Не удовольствия для, а фриланса ради пришлось работать с WinAPI. Всем известно, что это чистый С. Так вот захотел я привязать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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