Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Память, выделенная для строки

22.11.2016, 11:35. Показов 3175. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется код
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    std::string s = "Hi my name is John";
    std::string s2 = "Hi";
    std::cout << s.capacity() << std::endl;//18
    s = "test";
    std::cout << s.capacity() << std::endl;//18
    s = s2;
    std::cout << s.capacity();//2
}
Как можно заметить по значению capacity, память для вмещения строки выделяется динамически. Но если несколько раз подряд присвоить строке значение, которое меньше изначального, то capacity уменьшается что навод на мысль: программа возвращает неиспользуемую память которая была выделена прежде для хранения более длинной строки. В связи с этим у меня 2 вопроса:

1. Память возвращается менеджеру памяти или ОС и приводит ли это к переключению контекста между программным контекстом и контекстом ОС?
2. Как этого можно избежать? Допустим мне не нужно что бы выполнялись лишние телодвижения для возврата памяти пока capacity не превысит определенного значения или что бы capacity был всегда равен максимальному значению самой длинной строки которая побывала в определенном std::string
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2016, 11:35
Ответы с готовыми решениями:

Динамически выделенная память
Имеем прототип Polinomials operator+(const Polinomials &amp;) const; И имеем функцию Polinomials Polinomials::operator+ (const...

Резкий выход из проги: куда девается выделенная переменной память?
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int...

Ссылка, Указатель, Область памяти выделенная оператором new для указателя
Подскажите пожалуйста, как сделать ссылку на область памяти выделенную оператором new для указателя читая книгу Джесса Либерти в...

10
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2016, 11:41
http://www.cplusplus.com/refer... /capacity/
The capacity of a basic_string can be altered any time the object is modified, even if this modification implies a reduction in size or if the capacity has not been exhausted (this is in contrast with the guarantees given to capacity in vector containers).
Можно, конечно, написать свой аллокатор и передать его в конструкторе, но зачем?
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.11.2016, 11:47  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Можно, конечно, написать свой аллокатор и передать его в конструкторе, но зачем?
Интересует как можно избежать трату ресурсов на ненужные мне вещи

С++ так хорош, но блин столько вроде бы нужных вещей не реализованы. Печально. Сделали бы флаг (уменьшать выделенную память или нет) и все... вместо этого надо писать аллокатор
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2016, 12:03
Цитата Сообщение от sys_beginner Посмотреть сообщение
С++ так хорош, но блин столько вроде бы нужных вещей не реализованы.
Думаю, что std::basic_string не дураки писали и то, что он освобождает память когда посчитает нужным это нормально.
Можете использовать вектор из char, если хотите. Он память не освобождает "сам по себе".
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.11.2016, 12:06  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Думаю, что std::basic_string не дураки писали и то, что он освобождает память когда посчитает нужным это нормально.
Да, не дураки. Жалуюсь именно на малую функциональность
Но то что он освобождает память когда сам решил это не очень хорошо если нет возможности ему это запретить
Ведь освобождение памяти занимает рерсурсы. Там где преимущество отдается скорости а не памяти это не очень хорошее решение
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2016, 12:10
Цитата Сообщение от sys_beginner Посмотреть сообщение
Но то что он освобождает память когда сам решил это не очень хорошо если нет возможности ему это запретить
Есть - пишите свой аллокатор. В С++, как раз, возможно всё.
Цитата Сообщение от sys_beginner Посмотреть сообщение
Ведь освобождение памяти занимает рерсурсы.
1 тик процессора?
Цитата Сообщение от sys_beginner Посмотреть сообщение
Там где преимущество отдается скорости а не памяти это не очень хорошее решение
Надо еще замерить "падение производительности".
Если вам надо зарезервировать много места - используйте reserve()
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.11.2016, 12:16  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
1 тик процессора?
Не знаю сколько тиков.Но факт в том что лишние действия все же есть.
Это будет дорого стоить если такая операция может приводить к смене контекста от программы на ОС. Из за этого выше спрашивает про смену контекста

Цитата Сообщение от MrGluck Посмотреть сообщение
Если вам надо зарезервировать много места - используйте reserve()
Тогда лишусь той красоты что предлагает std::string. Ведь он не заранее выделяет много памяти а увеличивает его по мере роста строки (но не сразу берет большой кусок как вы предложили с использованием reserve())
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.11.2016, 12:21
Цитата Сообщение от sys_beginner Посмотреть сообщение
Это будет дорого стоить
Это микрооптимизация, на современном железе вы скорее всего вообще не почувствуете разницу. Гораздо важнее алгоритм.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.11.2016, 12:25  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
то микрооптимизация, на современном железе вы скорее всего вообще не почувствуете разницу. Гораздо важнее алгоритм.
Насколько мне известно, если обращений к программе много то частая смена контекста может быть достаточно дорогой потому что приводит к сбросу кеша TLB
Но я не уверен что для std::string такая ситуация имеет место быть
Вот бы разъяснил бы кто
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.11.2016, 13:44
Попробуйте на больших размерах строк,
желательно, чтобы содержимое строк было неизвестно во время компиляции,
иначе компилятор может применить оптимизацию SSO,
и все Ваши замеры и предположения будут неверными.
Плюс ко всему, в подобных вопросах
очень сильно влияет компилятор и ключи,
с которыми собиралось приложение, Вы этого не указали.
Здесь: http://rextester.com/MRCDL93116
получили
31
31
31
Здесь: http://rextester.com/FLTXI80868
22
22
22
Здесь: http://rextester.com/OJM87919
18
18
2
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.11.2016, 14:06  [ТС]
Croessmah,
Ясно, спасибо за информацию

Добавлено через 20 секунд
Сам на gcc проверял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2016, 14:06
Помогаю со студенческими работами здесь

Realloc выделяет память для массива int и не выделяет память для массива double
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int...

Может ли закончится память, выделенная под использование программы
У меня вопрос: может ли закончится память, выделенная под использование программы? Например, в графическом режиме, если создать...

Освобождается ли память выделенная под список и массив после завершения работы метода?
Вопрос по механике .Net. Есть статический метод. В методе происходит инициализация и создание списка List&lt;myClass&gt; оператором new....

Выделить из строки подстроки, не содержащих знаков: больше, меньше, равно. Каждая выделенная подстрока должна быть выведена с новой строки.
Ребят помогите,зачет завтра , а программы очень нужны) заранее благодарен! Это две разные программы: 1.Выделить из строки...

Почему выделенная внутри функции память удаляется после возврата функции? Это можно исправить?
Вот пример функции, которая выделяет память под переменную, объявленную за её пределами: void Foo (wchar_t* test) { test =...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru