Разбираясь с устройством ОЗУ пришел к вопросу о реализации 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 первых байта. Ну и исходя из листинга, получается, что все хранится в стеке, но тогда вопрос как реализовано выделение памяти под новые символы.
(в ответах ссылки на источники приветствуются)
Сам объект s
хранится в стеке, но в классе std::basic_string
должен быть доступ к внутреннему символьному массиву, который, в силу динамического размера строки, тоже является динамическим, т.е. хранится в куче. Однако в случае малых размеров строки может выполняться short string optimization, тогда и массив будет выделен на стеке.
Аналогичный вопрос на английском стеке https://stackoverflow.com/q/42049778.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Какие могут быть подводные камни если сделать глобальный указатель на объект по типу Sensormanager *sensormanager и передать его во второй потокОпределять...
Два скрипта взаимодействуют друг с другом: один написан на React, другой на jQueryВ React-компоненте есть textarea и есть событие onChange, которое изменяет...
Есть сайт генератор паролейТам при нажатии на кнопку идет плавный скролл
Есть текст в richTextBox1Как проверить, является ли выделенная область жирным текстом?