Где std::string выделено в память?

Вот функция:

void foo() {
   string str = "StackOverflo";
   str.push_back('w');
}

Когда мы объявляем строку внутри функции, она хранится в стеке или куче? Почему?

string foo() {
   string str = "StackOverflo";
   str.push_back('w');
   return str;
}

Можно ли вернуть ссылку на строку и продолжить использовать где-нибудь еще в программе?

Ответ 1

Когда мы объявляем строку внутри функции, она хранится в стеке или куче?

Сам строковый объект хранится в стеке, но указывает на память, находящуюся в куче.

Почему?

Язык определяется так, что строковый объект хранится в стеке. string для построения объекта использует память в куче.

Ответ 2

Объект str (это экземпляр класса std::string) выделяется в стеке. Однако сами строковые данные МОГУТ быть выделены в кучу. Это означает, что объект имеет внутренний указатель на буфер, содержащий фактическую строку. Однако, опять же, если строка мала (как в этом примере), обычно класс строк будет иметь то, что мы называем "оптимизацией небольших строк". Это означает, что размер самого объекта std::string достаточно, чтобы содержать данные строки, если он достаточно мал (обычно около 23 байтов + 1 байт для нуль-терминатора)... тогда, если содержимое больше, чем это, строковые данные будут выделены в куче.

Обычно вы можете нормально возвращать свою строку. С++ может справиться с этим для вас. Семантика перемещения может позаботиться о том, что необходимо здесь, чтобы вернуть строковый объект, указывающий на одни и те же строковые данные исходной строки, избегая делать ненужные копии.

Ответ 3

"StackOverflo", строковый литерал, скорее всего, хранится в пространстве данных только для чтения двоичного файла и отображается в памяти при запуске программы. Подробнее об этом можно узнать here.

str, экземпляр класса `, выделяется в стеке. Но память, которую его конструктор выделяет для создания копии строкового литерала, выделяется в куче.

Функция foo возвращает копию str, так что вы закодировали в порядке.

Ответ 4

все локальные переменные в С++ являются хранилищами в Stack. даже локальные указатели хранятся в стеке. но память, выделенная в указателе, хранится в куче.

Итак, ваш str хранится в Stack, а его значение сохраняется в куче. потому что std::string использует указатель char для выделения вашего "stackoverflow"

Ответ 5

На платформе Windows в C++ с std::string размер строки меньше чем около 14 символов или около того (известный как маленькая строка) хранится в стеке почти без издержек, тогда как размер строки выше хранится в куче с накладными расходами. Обычно зависит от платформы и компилятора, которые можно настроить с помощью параметров оптимизации.

std::string myStr {"Hello World"};//хранится в программном стеке std::string myStr {"Qaru спас жизнь программисту"};//указатель хранится в программном стеке, тогда как память для строки и выделяется в куче

Ниже ссылка имеет хорошее объяснение.https://blogs.msmvps.com/gdicanio/2016/11/17/the-small-string-optimization/