161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
|
|
1 | |
Немного про std::string08.07.2016, 00:16. Показов 2697. Ответов 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
|
08.07.2016, 00:16 | |
Ответы с готовыми решениями:
34
Не могу разобраться как обновить в std::map<std::string, вектор_структур> std::string, std::fstream, ошибка кучи Файловый поток и std::string Перевод строк std::string, std::wstring в Unicode (String) |
08.07.2016, 00:26 | 2 |
да любым - например, в виде односвязного списка чаров.
ЗЫ1: если абстракция предоставляет внешний апи - не стоит лезть и курочить ее нутрь. Потому что завтра новый Степанов перепишет эти стринги по-другому с сохранением апи, и ваша программа, рассчитывающая на нуль-терминатор, может свалиться. Например, паскалевские строки - хранят размер в первом байте. И можно на это рассчитывать. Но тогда длина не более 255, кому-то это однажды надоело, и он стал хранить длину в первом слове - двух байтах. И кто пользовался апи - не заметили, а кто рассчитывал на реализацию - приплыли. ЗЫ2: расположение строк строго в линейной области памяти - это хорошо. В Си. А в Яве с Шарпом решили гениально совместить это требование (само по себе необязательное - см. п 1) с иммутабельностью строк И начались ужасы от тех, кто не особо понимал, как это готовить без всяких стрингбилдеров, ибо при для иммутабельности строки при операциях (конкатенация/выделение подстроки и т.п.) копируются в новые области памяти, которые аллоцируются, и если в цикле - то долго и медленно... И из-за этой имхо странной реализации многие
0
|
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
|
|
08.07.2016, 00:45 [ТС] | 3 |
Это понятно, но ведь по перформансу-то долбанет же? Поэтому лучше всего contiguously in memory, так?
0
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
08.07.2016, 00:48 | 4 |
meJevin, требования ко всем контейнерам предъявляются не на их реализацию, а на производительность. Реализовать можете как угодно, лишь бы удовлетворяло условиям сложности.
0
|
08.07.2016, 00:50 | 5 |
Ну вы же не вчера структуры данных узнали. Долбанет по доступу за О(1) к любому элементу, зато позволит быстро расширять с головы, в отличие от стандартных массивов. В хаскеле, например, 2 типа строк - высокоуровневые - списки чаров, низкоуровневые - байтстринги. Тот же Джоэл Спольски, когэа в Майкрософте Эксель на Сях костылил, влепил туда паскалевские строки - "поэтому Эксель такой быстрый" (С). Короче - в зависит от области применения.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 02:24 | 6 |
Неправда ваша. В стандарте четко написано:
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 02:39 | 8 |
0
|
08.07.2016, 02:42 | 9 |
Резонно На это мы или свой буст не стд-шный навелосипедим, или стандарт поменяем (вроде какая-то российская компания стала официальным членом комитета что-ли, и может принимать предложения от соотечественников). Или и то и другое одновременно
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 02:48 | 10 |
Даже если и так,
std::string всегда будет содержать способ каста к си-строке "для совместимости"™. Теоретически можно сделать стринг на списках, с мутабельным массивом, и только кэшировать туда данные. Но, так может сделать только "мудакъ"®. А реализацию STL "мудаки"® не пишут.
1
|
08.07.2016, 03:00 | 11 |
И что? Уж каст то для совместимости можно сделать из чего угодно.
Я не знаком с авторами стл, чтобы иметь о них какое-либо мнение. Зато хорошо знаком с одним парнем, который выкинул нахрен все стл-ство (на которое молились предыдущие разрабы) из пендосского проекта, написал свои реализации и убыстрил его в несколько раз.
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 03:06 | 12 |
Та же фигня. Но это - фундаментальное свойство любой техники: Любое специальное устройство всегда оптимальнее общего.
Вопрос цены (в смысле затрат памяти итд).
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
08.07.2016, 04:20 | 13 |
Да ладно! Так-то по стандарту контейнер, например, есть массив, т.е. занимает непрерывный кусок памяти.
0
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
08.07.2016, 11:25 | 14 |
Mr.X, разве где-то описывается внутреннее устройство контейнера?
1
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 14:47 | 15 |
0
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
08.07.2016, 15:14 | 16 |
avgoor, про внутреннюю реализацию ни слова.
Добавлено через 19 минут avgoor, ну ни слова это я загул конечно. Спасибо за такое точное определение. Специально наперекор использование структуры массива могу предложить использование структуры список, где элементы размещаются последовательно в выделенном участке памяти (с помощью new с размещением). Конечно, никакой рациональностью тут и не пахнет, но все же.
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
08.07.2016, 15:41 | 17 |
Ой, пардон, я вектор имел в виду.
Для него в стандарте есть требование, чтобы он в памяти был подобен массиву.
0
|
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
|
|
08.07.2016, 15:54 | 18 |
Mr.X, вы, наверное, про метод data().
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
08.07.2016, 15:58 | 19 |
А указатели где хранить? В другом месте будет массив {1, 2, 3, 4, 5, ...}? Зачем? И самое главное, если список всегда располагается в памяти по последовательным адресам - такой список называется массивом.
В прочем выше я уже писал: "теоретически, можно...".
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
08.07.2016, 16:25 | 20 |
Я про то, что элементы вектора по стандарту хранятся в массиве, а адрес первого элемента вектора указывает на начало этого массива.
0
|
08.07.2016, 16:25 | |
08.07.2016, 16:25 | |
Помогаю со студенческими работами здесь
20
Заменить std::string на (String, UnicodeString, wchar_t) Перевод из Unicodestring B std::string String -> std::string Std::string в UnicodeString RAD XE4 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |