|
Заблокирован
|
|
Как выделяется память под массив string?11.09.2012, 12:55. Показов 34194. Ответов 28
Метки нет (Все метки)
В общем читаю книжку, там объявлены два массива int* p = new int[10], int* v = new string[10]... бла бла бла ....а потом -> ...После резервирования области памяти, предназначенной для хранения объектов...и тут загвоздка, ну с integer все понятно, а как выделяется под string память? я же могу ввести один символ "а"\0 а могу целый файл туда в string затолкать, строк эдак на 1000 ....куда бедный указатель будет указывать после приращения ++v ?
0
|
|
| 11.09.2012, 12:55 | |
|
Ответы с готовыми решениями:
28
Почему не выделяется память под двумерный массив?
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 11.09.2012, 13:05 | |
|
1
|
|
|
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
|
|||||||
| 11.09.2012, 13:07 | |||||||
|
Указатель будет указывать куда надо, потому что в string есть свой указатель (или указатели), управляющие памятью. В том и суть, чтобы программист перестал об этом думать.
Добавлено через 1 минуту
1
|
|||||||
|
Заблокирован
|
|
| 11.09.2012, 13:20 [ТС] | |
|
0
|
|
| 11.09.2012, 14:09 | ||
Если речь о std::string из stl, внутри имеется свой динамический массив, кем он управляется - дело десятое, есть какой-то аллокатор, наверняка как в векторе резервируется память заранее.
0
|
||
|
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
|
||||||
| 11.09.2012, 14:14 | ||||||
|
Память резервируется по мере необходимости. Если памяти меньше чем необходимо для выполнения операции (например, при конкатенации), то происходит выделение памяти необходимого размера. В некоторых случаях для того, чтобы избежать многократных операций выделения памяти и копирования нужно использовать метод reserve. Вот небольшой синтетический пример, где можно избежать этих выделений и копирований:
0
|
||||||
|
|
|||||||||||
| 11.09.2012, 17:30 | |||||||||||
|
На сколько я понял ТС не про это спрашивал. Вопрос был про new std::string[10], типа откуда компилятор знает, сколько памяти выделять, ведь строки могут быть разных размеров.
Так вот, размер строки не имеет значения, потому как размер объекта std::string - величина постоянная (не надо путать размер объекта и размер строки). Для примера
2
|
|||||||||||
|
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
|
||
| 11.09.2012, 18:16 | ||
|
Но суть верна: размер обьекта std::string == const, память которую он выделяет под саму строку выделяется отдельно в куче в конструкторе и операторе присваивания
0
|
||
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
| 11.09.2012, 22:01 | |
|
Размер объекта любого типа константен, sizeof операция не времени выполнения, а времени компиляции. Размер объекта должен быть известен во время компиляции. В стандарте, на сколько мне известно, вообще не оговорены размеры объектов кроме типа char, который должен быть равен 1 байту. В частности - std::string содержит указатель на динамическую память. Размер указателя на 32 битной и 64 битной системах разный ( 4 байта и 8 байт соответственно ), поэтому размер string на этих системах будет разный.
0
|
|
|
Заблокирован
|
|
| 19.09.2012, 21:26 [ТС] | |
|
Решил погуглить на тему "c++ string как выделяется память" и напоролся на собственную тему, в прошлый раз я так и не понял ничего... Что все таки представляет собой тип string? В принципе в рамках одного элемента реально пофиг как он там будет в памяти сидеть. Интересно другое, задаешь например тип вектор, допустим, из 10 элементов string. Вот тут начинается (у меня) путаница с памятью. Вектор выделяет для себя некоторый кусок памяти. Если задать итераторы и не выполнять удаления\добавления элементов в центре контейнера то по идее они не должны менять свое значение. Воооот, тепер вопрос по string у, компилятор наверно каждому элементу стриг выделяет какой-то объем памяти, возможно, если строка превышает количество выделенного для нее "места" то объем для стринга должен увеличиться, но
1.как если элемент находится в векторе? если увеличить объем одной ячейки то итераторы будут указывать или неверно или чушь полную... 2.если увеличится объем памяти для одного стринга в векторе, то это должно повлиять и на увеличение всех остальных элементов. В общем как не думал, у меня в башке string какая-то безразмерная величина получается... А, понял, если string это указатель на динамическую память, то вектор string ов всего лишь контейнер с указателями... А там что творится в этой динамической памяти одному богу пожалуй известно...
1
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 19.09.2012, 21:43 | ||||||
|
Ну вроде вы на верном пути если упростить строку и считать ее указателем на символы, то примерно это выглядит так:
0
|
||||||
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
| 19.09.2012, 21:47 | ||||||
|
String это класс, точнее синоним для
0
|
||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 19.09.2012, 21:52 | |
|
ну понятно что не указатели, а объекты. для упрощения было принято, что эти объекты представляют из себя некую оболочку над указателями, или просто указатели. ведь что внутри строки? указатель на буфер + какие-то дополнительные члены для чего-нибудь.
0
|
|
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||
| 19.09.2012, 22:03 | ||
|
Не по теме: DU, эт я ТСу :) Это ведь не оговорено нигде.
0
|
||
|
just_lexx
|
|
| 21.02.2014, 18:48 | |
|
Серьезно задался вопросом сколько памяти займет одно использование переменной типа string. Однозначного ответа не нашел. Нашел не очень понятный мне отрывок из книги.
Совет 15: http://cpp.com.ru/meyers/ch2.html#t30 Но вероятно он может частично дать ответ на вопрос автора. |
|
|
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 1
|
|||||||||||
| 04.09.2017, 00:24 | |||||||||||
|
Чтобы не париться по поводу выделения памяти в string, можно создать массив строк более простым способом.
Опишем тип - структура.
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 04.09.2017, 02:33 | ||||
|
пользоваться в своё удовольствие, и не забивать себе голову ручной работой с new/delete а не заниматься всякой фигней навроде:
0
|
||||
|
0 / 0 / 0
Регистрация: 19.02.2020
Сообщений: 15
|
||||||
| 27.02.2025, 14:36 | ||||||
|
Действительно. Вот такой вопрос: если создать std::vector <string> S и начать вносить в него элементы, где первый элемент 1 символ, второй 200 символов, третий 10000. Используя string мы сэкономим память? Просто набрал программку и она показывает, что каждый элемент string в vector занимает 32 бита (на моей ОС). Получается оптимизации памяти нет? И лучше работать с указателями, new и delete, чтобы под каждый отдельный элемент подбирать размер. Например, как тут:
Если все так, то наиболее оптимальный вариант для экономии памяти это *, new, delete и массив char? Спасибо всем кто ответит.
0
|
||||||
|
Вездепух
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
|
|||||||
| 27.02.2025, 15:46 | |||||||
|
32 байта - нормально для std::string.std::vector<std::string> - это много строк. То есть это совершенно не сравнимые примеры. Так о чем вы говорите? Об одной строке или о "много строк"? std::vector<std::string>, то есть о массиве строк. Ну так покажите, как вы собрались делать массив строк при помощи "new, delete и массив char". Тогда и полноценно сравнивать что-то можно будет.
0
|
|||||||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
||||||||||||||||||
| 27.02.2025, 16:00 | ||||||||||||||||||
|
Будет использован объем равен одному вектору типа string и трем стрингам различной длинны. В некоторых случаях с SSO (Short String Optimization) - размер может быть другим, немного.
Добавлено через 1 минуту И вывод уже немного другой :
1
|
||||||||||||||||||
| 27.02.2025, 16:00 | |
|
Помогаю со студенческими работами здесь
20
Как выделить память под динамический двумерный массив Как правильно выделить память под двумерный массив в шаблоне?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|