Как размещается std::string в памяти

82
19 января 2022, 02:50

Разбираясь с устройством ОЗУ пришел к вопросу о реализации string'a. По идее это уже просто стандартная штука, но не смог найти нужной инфы. Вопрос стоит так: пусть я объявил и считал строковую переменную s

std::string s;
std::cin >> s;

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

Попробовал сам выяснить и написал следующее:

int main()
{
    int stack_top;
    int stack_bottom;
    string s;
    __asm {
        mov stack_top, esp
        mov stack_bottom, ebp
    }
    cin >> s;
    cout << "top = " << stack_top << endl;
    cout << "bottom = " << stack_bottom << endl;
    cout << "\n\n&s = " << &s << endl;
    for (size_t i = 0; i < s.size(); i++)
        cout << (int)&(s[i]) << " ";
    return 0;
}

Введя 1234 в качестве строки, получил:

]1

006FF830 соответствует ‭7338032‬ байту, в связи с чем не понятно, на что идут 4 первых байта. Ну и исходя из листинга, получается, что все хранится в стеке, но тогда вопрос как реализовано выделение памяти под новые символы.

(в ответах ссылки на источники приветствуются)

Answer 1

Сам объект s хранится в стеке, но в классе std::basic_string должен быть доступ к внутреннему символьному массиву, который, в силу динамического размера строки, тоже является динамическим, т.е. хранится в куче. Однако в случае малых размеров строки может выполняться short string optimization, тогда и массив будет выделен на стеке.

Аналогичный вопрос на английском стеке https://stackoverflow.com/q/42049778.

READ ALSO
Глобальный указатель на объект

Глобальный указатель на объект

Какие могут быть подводные камни если сделать глобальный указатель на объект по типу Sensormanager *sensormanager и передать его во второй потокОпределять...

105
В React input изменяется jQuery

В React input изменяется jQuery

Два скрипта взаимодействуют друг с другом: один написан на React, другой на jQueryВ React-компоненте есть textarea и есть событие onChange, которое изменяет...

95
Как сделать плавный скролл? [дубликат]

Как сделать плавный скролл? [дубликат]

Есть сайт генератор паролейТам при нажатии на кнопку идет плавный скролл

102
Проверить, является ли выделенный текст жирным? C#

Проверить, является ли выделенный текст жирным? C#

Есть текст в richTextBox1Как проверить, является ли выделенная область жирным текстом?

73