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

Как выделяется память под массив string? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.64
AnreyKazakov
Заблокирован
11.09.2012, 12:55     Как выделяется память под массив string? #1
В общем читаю книжку, там объявлены два массива int* p = new int[10], int* v = new string[10]... бла бла бла ....а потом -> ...После резервирования области памяти, предназначенной для хранения объектов...и тут загвоздка, ну с integer все понятно, а как выделяется под string память? я же могу ввести один символ "а"\0 а могу целый файл туда в string затолкать, строк эдак на 1000 ....куда бедный указатель будет указывать после приращения ++v ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.09.2012, 13:05     Как выделяется память под массив string? #2
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
int* v = new string[10]
Это не скомпилируется.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
11.09.2012, 13:07     Как выделяется память под массив string? #3
Указатель будет указывать куда надо, потому что в string есть свой указатель (или указатели), управляющие памятью. В том и суть, чтобы программист перестал об этом думать.

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это не скомпилируется.
Кстати, да.
C++
1
string* s = new string[10];
AnreyKazakov
Заблокирован
11.09.2012, 13:20  [ТС]     Как выделяется память под массив string? #4
Цитата Сообщение от Deviaphan Посмотреть сообщение
Это не скомпилируется
Ну, подумаешь ошибся, суть то не в этом была... =)
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
11.09.2012, 14:09     Как выделяется память под массив string? #5
Ну, подумаешь ошибся, суть то не в этом была... =)
Нифига себе "подумаешь ошибся", начни с изучения типизации C++, а потом за указатели берись :-)
Если речь о std::string из stl, внутри имеется свой динамический массив, кем он управляется - дело десятое, есть какой-то аллокатор, наверняка как в векторе резервируется память заранее.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
11.09.2012, 14:14     Как выделяется память под массив string? #6
Память резервируется по мере необходимости. Если памяти меньше чем необходимо для выполнения операции (например, при конкатенации), то происходит выделение памяти необходимого размера. В некоторых случаях для того, чтобы избежать многократных операций выделения памяти и копирования нужно использовать метод reserve. Вот небольшой синтетический пример, где можно избежать этих выделений и копирований:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int main()
{
   string str;
   string appendStr = "string to append";
   const int APP_TIMES = 20;
   cout<<"New created string capacity: "<<str.capacity()<<'\n';
   
//  str.reserve(str.size() + APP_TIMES * appendStr.size());
//  cout<<"Reserved memory for elements. Capacity: "<<str.capacity()<<'\n';   
   
   for(int i = 0; i < APP_TIMES; ++i)
   {
      str += appendStr;
      cout<<"appending '"<<appendStr<<"' to str. capacity: "<<str.capacity()<<'\n';
   } 
      
   return 0;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.09.2012, 17:30     Как выделяется память под массив string? #7
На сколько я понял ТС не про это спрашивал. Вопрос был про new std::string[10], типа откуда компилятор знает, сколько памяти выделять, ведь строки могут быть разных размеров.
Так вот, размер строки не имеет значения, потому как размер объекта std::string - величина постоянная (не надо путать размер объекта и размер строки).
Для примера
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int main ()
{
    std::string str1 = "a";
    std::string str2 = "aklsdjfaklsjfdkas;fjak;lsdfjaks jfasdfj jidf joaijf klj  \
        asdkfj ajf aij fwoijowij oijf oiajefwiojf anvj knvv aoijf \
        asdfhjkashdf ajfasjf ksa;jf asodfjioasdjfiopadfjasdjfklasd;jf;asl \
        asjdfhjkaslhfdkasdljf qwjer iojfoiawjfksald;jf sakdl;jf jsaifjw[oej";
 
    std::cout << "sizeof(str1) = " << sizeof(str1) << std::endl 
              << "sizeof(str2) = " << sizeof(str2) << std::endl
              << "sizeof(std::string) = " <<  sizeof(std::string) <<  std::endl;
 
    return 0;
}
вот вывод одного из компиляторов (думаю, это компиляторозависимая величина, хотя можно в стандарт заглянуть):
Код
sizeof(str1) = 32
sizeof(str2) = 32
sizeof(std::string) = 32
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
11.09.2012, 18:16     Как выделяется память под массив string? #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
думаю, это компиляторозависимая величина, хотя можно в стандарт заглянуть
Зависимая. Некоторые реализации STL держат небольшой буффер чтобы там хранить маленькие строки без доп. выделений памяти.
Но суть верна: размер обьекта std::string == const, память которую он выделяет под саму строку выделяется отдельно в куче в конструкторе и операторе присваивания
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2012, 22:01     Как выделяется память под массив string? #9
Размер объекта любого типа константен, sizeof операция не времени выполнения, а времени компиляции. Размер объекта должен быть известен во время компиляции. В стандарте, на сколько мне известно, вообще не оговорены размеры объектов кроме типа char, который должен быть равен 1 байту. В частности - std::string содержит указатель на динамическую память. Размер указателя на 32 битной и 64 битной системах разный ( 4 байта и 8 байт соответственно ), поэтому размер string на этих системах будет разный.
AnreyKazakov
Заблокирован
19.09.2012, 21:26  [ТС]     Как выделяется память под массив string? #10
Решил погуглить на тему "c++ string как выделяется память" и напоролся на собственную тему, в прошлый раз я так и не понял ничего... Что все таки представляет собой тип string? В принципе в рамках одного элемента реально пофиг как он там будет в памяти сидеть. Интересно другое, задаешь например тип вектор, допустим, из 10 элементов string. Вот тут начинается (у меня) путаница с памятью. Вектор выделяет для себя некоторый кусок памяти. Если задать итераторы и не выполнять удаления\добавления элементов в центре контейнера то по идее они не должны менять свое значение. Воооот, тепер вопрос по string у, компилятор наверно каждому элементу стриг выделяет какой-то объем памяти, возможно, если строка превышает количество выделенного для нее "места" то объем для стринга должен увеличиться, но
1.как если элемент находится в векторе? если увеличить объем одной ячейки то итераторы будут указывать или неверно или чушь полную...
2.если увеличится объем памяти для одного стринга в векторе, то это должно повлиять и на увеличение всех остальных элементов.
В общем как не думал, у меня в башке string какая-то безразмерная величина получается...
А, понял, если string это указатель на динамическую память, то вектор string ов всего лишь контейнер с указателями... А там что творится в этой динамической памяти одному богу пожалуй известно...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 21:43     Как выделяется память под массив string? #11
Ну вроде вы на верном пути если упростить строку и считать ее указателем на символы, то примерно это выглядит так:

C++
1
2
3
4
[s   s    s    s    s  ...   s] - это указатели на массивы байт, в которых хранятся символы строки. размер указателей фиксированный
     |              |
     |              |
    ["dfsdf"]    ["sdfsfsfsdfsfsfsfsfsfsfsd"]  -  a это то, на что эти указатели указывают.
Т.е. для выделения 10 строк в массиве нужно вполне конкретное количество байтов памяти, равное N = sizeof(std::string) * 10, и то, что внутри себя эти std::string указывают на область памяти любого размера не влияют на это число N.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
19.09.2012, 21:47     Как выделяется память под массив string? #12
String это класс, точнее синоним для
C++
1
basic_string< char >
. Поэтому в векторе хранятся объекты класса, а не указатели.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.09.2012, 21:52     Как выделяется память под массив string? #13
ну понятно что не указатели, а объекты. для упрощения было принято, что эти объекты представляют из себя некую оболочку над указателями, или просто указатели. ведь что внутри строки? указатель на буфер + какие-то дополнительные члены для чего-нибудь.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
19.09.2012, 22:03     Как выделяется память под массив string? #14

Не по теме:

DU, эт я ТСу


Цитата Сообщение от DU Посмотреть сообщение
ведь что внутри строки?
Там может быть все что угодно Это ведь не оговорено нигде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 18:48     Как выделяется память под массив string?
Еще ссылки по теме:

C++ Выделяется ли память?
C++ Как выделяется память на стеке и на куче? Когда нужна ручная очистка?
Не выделяется память в динамической памяти C++

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

Или воспользуйтесь поиском по форуму:
just_lexx
Сообщений: n/a
21.02.2014, 18:48     Как выделяется память под массив string? #15
Серьезно задался вопросом сколько памяти займет одно использование переменной типа string. Однозначного ответа не нашел. Нашел не очень понятный мне отрывок из книги.

Совет 15:
http://cpp.com.ru/meyers/ch2.html#t30

Но вероятно он может частично дать ответ на вопрос автора.
Yandex
Объявления
21.02.2014, 18:48     Как выделяется память под массив string?
Ответ Создать тему
Опции темы

Текущее время: 16:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru