Программирование на C было очень простым. По крайней мере, с точки зрения памяти. Мы знаем, где хранятся переменные. Они не хранятся в куче до тех пор, пока мы не используем malloc / calloc. Однако C ++ имеет множество классов и библиотек, которые отвлекают хранилище от разработчика. Это хорошо, потому что избавляет разработчика от таких проблем, как утечка памяти, двойное освобождение, SegFaults и т. Д. Если вам нужно освежить память, вы можете обратиться к вводному разделу моей истории Fork vs Thread.

Стек или куча?

Так хранится ли строка C ++ в стеке или куче? Что ж, ответ: «Это зависит от…». Давайте разберемся в этом на небольшом примере.

Вышеупомянутая программа представляет собой простую программу на C ++, которая сохраняет строку в переменной и распечатывает ее. Мы также переопределяем новый оператор. Итак, если строка была размещена в куче, должна быть вызвана новая функция, и мы должны увидеть сообщение «Выделено…». Если строка хранится в стеке, мы не сможем увидеть сообщение «Выделено…». Мы просто увидим строку, которую мы сохранили. При компиляции и выполнении приведенного выше кода мы получаем:

$ g++ small_string.cpp -o small_string;./small_String 
0123456789

Мы видим, что храним строку длиной 11 символов (10 + нулевой символ). Давайте изменим программу, увеличив размер строки до 15 символов (16 добавив нулевой символ).

Результатом вышеупомянутой программы является

$ g++ stillsmall_string.cpp -o stillsmall_string;./stillsmall_string 
012345678901234

Сообщение «Выделено…» по-прежнему не отображается. Увеличим строку еще на один символ.

Увеличиваем количество символов до 16 (17 добавляем нулевой символ). В выходных данных ниже показано сообщение «Выделено…».

$ g++ large_string.cpp -o large_string; ./large_string 
Allocated 17 bytes
0123456789012345

В приведенном выше выводе мы видим, что была вызвана новая функция, которую мы переопределили, что означает, что строка была сохранена в куче.

* Таким образом, любая строка, длина которой превышает 15, сохраняется в куче.

Вывод

Я не зря добавил в приведенное выше утверждение «*». Ответ на мой предыдущий вопрос «Так хранится ли строка C ++ в стеке или куче? Это зависит ». это просто не зависит от длины строки. Это зависит от компилятора и базовой операционной системы. Вышеупомянутые программы выполнялись с помощью ubuntu и g ++ - 7.5.0. Я смог увидеть такие же результаты в Mac OS. Эта длина 15 может варьироваться в зависимости от операционной системы. Фактически, в Fedora и Red Hat строки всегда хранятся в куче. Они никогда не хранятся в стеке.

Мы видели, как строки хранятся в стеке и куче. Во второй части статьи (Общие сведения о хранении строк в C ++ - Часть 2: Стек) давайте разберемся в необработанном формате, в котором они хранятся в памяти.