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

Вопрос по вектору string'ов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.04.2011, 21:49     Вопрос по вектору string'ов #1
Не совсем представляю как работает вектор стрингов
C++
1
std::vector<std::string> texts;
Вектор по стандарту располагается в едином куске памяти. Если я использую вектор чаров (массивов), они фиксированного размера. Это значит что при выделении памяти методом reserve я четко выделяю себе нужный кусок памяти, при изменении элемента в середине, сдвига всего, что идет после - не происходит. А вот со стрингом не понятно. При выделении памяти вродебы размер элемента составляет 1 байт... Получается количество элементов, которое поместится в выделенную память предсказать нельзя.
Если я меняю содержимое стринга, находящегося в середине вектора, всё, что идёт после - смещается, если размер нового стринга не равен размеру старого. Я прав?
Или вектор стрингов - это вектор указателей, а информация хранится вне его?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2011, 21:49     Вопрос по вектору string'ов
Посмотрите здесь:

Вопрос нуба о типе STRING C++
Вопрос по строкам (string) C++
Вопрос по string'у C++
C++ Поиск строки по вектору
C++ Можно ли применить find_if к вектору
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
24.04.2011, 21:55     Вопрос по вектору string'ов #2
Реализации std::string, вообще говоря, бывают разные, но в целом они все действуют по одной схеме: в самом объекте хранится только указатель на строковый буфер, с которым будет вестись работа, так что размеры каждого std::string будут фиксированными в представлении вектора и того, что вы описали, не возникнет.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 21:55     Вопрос по вектору string'ов #3
Начинать надо с конца. Как представлен класс std::string? Он содержит в себе указатель на символьный тип. Т.е. сам экземпляр лежит в одном куске памяти, а массив символов - в другом. Поэтому экземпляр имеет фиксированный размер (который не включает в себя размер символьного массива). Вектор (кстати, точно не уверен, но по-моему в стандарте ничего о непрерывности участка памяти не сказано, однако не о том сейчас) строк будет хранить в себе экземпляры строкового класса фиксированного одинакового размера, в каждом из которых располагается указатель на массив символов, который может лежать где угодно в памяти.
Ma3a
24.04.2011, 22:04
  #4

Не по теме:

silent_1991, в C++98 по поводу вектора действительно ничего не сказано, но в C++03 и C++0x этот момент явно оговорен

Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.04.2011, 22:06  [ТС]     Вопрос по вектору string'ов #5
Понятно, значит всётаки указатель...
Получается если я использую стринг, то
- экономится место в памяти
- при каждом добавлении/замене элемента происходит выделение/освобождение памяти
При использовании массива чаров
- место не экономится... в среднем в моей задаче я тогда теряю ~20% памяти
- при резервировании выделекния/освобождения памяти не происходит
Вопросы
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
2. Что на ваш взгляд будет быстрее, вектор стрингов 1гб или вектор чаров 1,3 гб, если по вектору производится только операция поиска и он несортированный?
silent_1991
24.04.2011, 22:12
  #6

Не по теме:

Ma3a, да, на счёт C++0x знал, а на счёт 03 уверен как раз не был))

Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
24.04.2011, 22:19  [ТС]     Вопрос по вектору string'ов #7
А по теме, на мои вопросы ответите? Хотябы предположение
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
24.04.2011, 22:31     Вопрос по вектору string'ов #8
Цитата Сообщение от Union Посмотреть сообщение
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
В принципе никаких выделений и освобождений быть не должно, будет просто копирование из одного буфера в другой, хотя это, опять же, зависит от того, как вы заменяете, то есть если через конструирование безымянных std::string, естественно, будет выделяться и освобождаться память из под этих конструируемых объектов.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
24.04.2011, 22:51     Вопрос по вектору string'ов #9
Цитата Сообщение от Union Посмотреть сообщение
1. Если я заменяю в векторе один стринг на другой, тогоже размера - только в этом случае освобождения и выделения памяти не происходит? Или происходит во всех случаях?
зависит от реализации
если string реализован по идиоме конверт-письмо (std::string - конверт, символьный буфер - письмо), то при присвоении одного string другому один из string просто получит указатель на буфер другого (те оба конверта будут использовать одно письмо, с учетом подсчета ссылок итп)
Цитата Сообщение от Union Посмотреть сообщение
2. Что на ваш взгляд будет быстрее, вектор стрингов 1гб или вектор чаров 1,3 гб, если по вектору производится только операция поиска и он несортированный?
я гдето уже это видел, возьмите и померьте
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.04.2011, 00:41     Вопрос по вектору string'ов #10
Цитата Сообщение от Union Посмотреть сообщение
Получается если я использую стринг, то
- экономится место в памяти
Только не это. Вот, допустим,
C++
1
char* p= "cafebabe";
Вот сколько ты видишь памяти занято явно, столько и занято. 13 байт.

C++
1
string str= "cafebabe";
Вот тут сколько занято? Точно не подсчитывал да и не собираюсь, ибо для побайтного контроля есть пример выше С. Но точно не меньше. Ибо, допустим вызовы методов как-то ведь реализуются?
C++
1
string.size();
Ну то есть должна быть где-то определена функция size, а непосредвственно в каждом объекте типа string указатель на эту функцию, а таких функций много.

Ну то есть за удобство платим памятью и скоростью
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.04.2011, 00:42     Вопрос по вектору string'ов #11
kravam, Размер string-a это указатель на char + две переменных типа size_t.
Хотя зависит от реализации.
Хотя у меня пустой объект string - у меня 32 байта весит)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.04.2011, 00:46     Вопрос по вектору string'ов #12
kravam, никаких указателей на функции в объекте не сидит, при вызове в функцию неявно передаётся указатель на объект, который её вызвал, и внутри функции имеет имя this.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.04.2011, 01:09     Вопрос по вектору string'ов #13
Ну я это и имел ввиду. Главное, что памяти там нормально расходуется. Остальное- суета сует и томление духа.
silent_1991
25.04.2011, 01:11
  #14

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
Остальное- суета сует и томление духа
ИМХО единственная суета - вручную работать со строками, когда всё уже написано до нас))))

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.04.2011, 01:13     Вопрос по вектору string'ов #15
kravam,

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
 
int main()
{
    std::string some_str = "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
    std::cout<<sizeof(some_str)<<'\n';
    const char str[] = "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
    std::cout<<sizeof(str);
}
Ну как бэ как-то так... 32 против 73... Если использовать конст указатель на char будет другое дело конечно, но все же.
silent_1991
25.04.2011, 01:15
  #16

Не по теме:

ForEveR, не, ну это не честно))) Тут в первом случае тоже 73 надо бы прибавить, для полноты картины)))

fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.04.2011, 01:17     Вопрос по вектору string'ов #17
Может быть еще будет важно в какой области памяти лежат строки, в случае динамического выделения это будет куча, а в случае статического стек. При таких объемах данных, наверное, это будет важно
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.04.2011, 01:42     Вопрос по вектору string'ов #18
ForEveR, не пойдёт. Щас я бы поговорил не о размерах переменных, а о том, сколько памяти выделяется и в том и в другом случае. Как я уже сказал, в случае со string я могу только предполагать, но иногда- иногда- знаю наверняка. Так вот,

C++
1
2
std::string some_str = 
        "klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
Так вот, в данном случае

C++
1
"klklkjkjkjnmxncmznjdfhjnczc,zxjmzj,fkkzlxmcx,czjfkjcm,zxcxnkalkjkasjda;l";
есть. И соответствено занимает память. А то, что мы не увидели объёма занимаемой ей памяти, так это вот и есть как бы вот так вот ну вот.

Далее, о чём я.
C++
1
string str;
Вот после этого объявления создаются коды всякие функций и пускай они типа ни при делах а вообще, и мы вроде как их только имеем ввиду, но код той же функции str.size() в оперативной памяти место занимает, как ни крути. И коды других функций методов тоже. И это всё влияет на размер файла соответственно. К сожалению не знаю как получать указатели на эти функции, а то бы специально поставил бы бряки на эти адреса и посмотрел отладчике память, занимаемую этими функциями.
Вот что я имел ввиду, говоря о расходе памяти в случае со string.

А указатель на char 4 байта ни больше ни меньше.

Добавлено через 54 секунды
silent_1991, в смысле, а как не вручную-то? Чё-то я не понимаю
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.04.2011, 01:49     Вопрос по вектору string'ов #19
kravam, вручную - это
C++
1
2
char *str2 = new char [strlen(str1) + 1];
strcpy(str2, str1);
вместо
C++
1
std::string str2 = str1;
Ну как пример.

Цитата Сообщение от kravam Посмотреть сообщение
Вот после этого объявления создаются коды всякие функций
Ничего подобного, в код будут включены только те функции, которые хотя бы однажды вызываются.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2011, 01:49     Вопрос по вектору string'ов
Еще ссылки по теме:

C++ Обращение к вектору полученному через указатель
Присвоить вектору значения сумм строк матрицы C++
C++ Можно ли значение вектора A передать вектору B через swap?

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.04.2011, 01:49     Вопрос по вектору string'ов #20
Цитата Сообщение от kravam Посмотреть сообщение
Вот после этого объявления создаются коды всякие функций и пускай они типа ни при делах а вообще, и мы вроде как их только имеем ввиду, но код той же функции str.size() в оперативной памяти место занимает, как ни крути. И коды других функций методов тоже. И это всё влияет на размер файла соответственно.
Не намного больше, чем любая сишная функция, например strlen. Классы конечно будут съедать чуть больше, но это настолько незначительно. Ну и на оперативную память это действительно мало влияет.
Yandex
Объявления
25.04.2011, 01:49     Вопрос по вектору string'ов
Ответ Создать тему
Опции темы

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