Вот функция:
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/