powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::string
10 сообщений из 10, страница 1 из 1
std::string
    #39577863
Семен.Семенович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые программисты.

Если не сложно поделитесь экспертизой о том как устроен std::string.

Правильно ли я понимаю, что по умолчанию там существует некий Allocator (зашитый в шаблоне)
который определяет где будет аллоцироваться память под строку (в хипе или на стеке).

Но есть еще некий Small String Optimizator который аллоцирует на стеке если строка маленькая.

Буду благодарен за подробное объяснение как вся эта кухня работает.

P.S.: Если нет желания мне что то объяснять и захочется отправить меня читать документацию - прошу не сердиться и просто проигнорировать тему.

Заранее огромное спасибо.
...
Рейтинг: 0 / 0
std::string
    #39577906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семен.Семенович,

Если убрать несущественные детали:
Код: plaintext
1.
2.
3.
4.
5.
6.
class string
{
   char* data;
   size_t len;
   char short_data[N];
};



Если строка меньше N то она размещается прямо внутри объекта в массиве short_data[], и data указывает на short_data, а если больше, то буфер создается в куче с помощью new char[len], и data указывает на него.
...
Рейтинг: 0 / 0
std::string
    #39577914
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В basic_string.h:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 139       _Alloc_hider  _M_dataplus;
 140       size_type   _M_string_length;
 141
 142       enum { _S_local_capacity = 15 / sizeof(_CharT) };
 143
 144       union
 145       {
 146   _CharT           _M_local_buf[_S_local_capacity + 1];
 147   size_type        _M_allocated_capacity;
 148       };


Соответственно при попытке присвоить короткую строку происходит что-то вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 550       basic_string(basic_string&& __str, const _Alloc& __a)
 551       noexcept(_Alloc_traits::_S_always_equal())
 552       : _M_dataplus(_M_local_data(), __a)
 553       {
 554         if (__str._M_is_local())
 555           {
 556             traits_type::copy(_M_local_buf, __str._M_local_buf,
 557                               _S_local_capacity + 1);
 558             _M_length(__str.length());
 559             __str._M_set_length(0);
 560           }
...
Рейтинг: 0 / 0
std::string
    #39577932
Семен.Семенович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага понял, спасибо
...
Рейтинг: 0 / 0
std::string
    #39578345
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семен.СеменовичДобрый день уважаемые программисты.

Если не сложно поделитесь экспертизой о том как устроен std::string.

Правильно ли я понимаю, что по умолчанию там существует некий Allocator (зашитый в шаблоне)
который определяет где будет аллоцироваться память под строку (в хипе или на стеке).

Но есть еще некий Small String Optimizator который аллоцирует на стеке если строка маленькая.

Буду благодарен за подробное объяснение как вся эта кухня работает.

P.S.: Если нет желания мне что то объяснять и захочется отправить меня читать документацию - прошу не сердиться и просто проигнорировать тему.

Заранее огромное спасибо.


нельзя для string аллоцировать память на стеке...
...
Рейтинг: 0 / 0
std::string
    #39578350
Семен.Семенович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

А эксперты выше пишут иное
...
Рейтинг: 0 / 0
std::string
    #39578412
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семен.СеменовичMasterZiv,

А эксперты выше пишут иное
Они пишут что символы строки могут быть расположены внутри объекта строки. А объект может быть при этом и на куче и на стэке.
...
Рейтинг: 0 / 0
std::string
    #39578430
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что будем делать с c_str() ?
...
Рейтинг: 0 / 0
std::string
    #39578456
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kОни пишут что символы строки могут быть расположены внутри объекта строки. А объект может быть при этом и на куче и на стэке.
На самом деле аллокатор размещающий именно на стеке тоже возможен. Просто надо понимать последствия ))
maytonЧто будем делать с c_str() ?
С ней все ок, ничего не надо делать ))
...
Рейтинг: 0 / 0
std::string
    #39578507
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто будем делать с c_str() ?
менять на data() :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::string
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]