Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / std::string / 10 сообщений из 10, страница 1 из 1
29.12.2017, 13:18
    #39577863
Семен.Семенович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::string
Добрый день уважаемые программисты.

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

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

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

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

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

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

Если убрать несущественные детали:
Код: 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
29.12.2017, 14:14
    #39577914
wst
wst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::string
В 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
29.12.2017, 14:38
    #39577932
Семен.Семенович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::string
Ага понял, спасибо
...
Рейтинг: 0 / 0
31.12.2017, 07:37
    #39578345
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
std::string
Семен.СеменовичДобрый день уважаемые программисты.

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

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

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

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

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

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


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

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

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


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