Куча или стек?Когда константная строка упоминается в вызове функции в C ++ - PullRequest
5 голосов
/ 16 сентября 2011

Рассмотрим функцию:

char *func()
{
    return "Some thing";
}

Является ли постоянная string (char массив) "Some thing" сохраненной в стеке как локальная для вызова функции или как глобальная в куче?

Я догадываюсь это в куче.

Если функция вызывается несколько раз, сколько копий "Some thing" находится в памяти?(А это куча или стек?)

Ответы [ 4 ]

9 голосов
/ 16 сентября 2011

Строковый литерал "Something" имеет тип const char*. Таким образом, они не находятся ни в куче, ни в стеке, а в месте, доступном только для чтения, что является подробностью реализации.

Из Википедия

Данные

Область данных содержит глобальные и статические переменные, используемые программой которые инициализированы. Этот сегмент может быть далее классифицирован в инициализированная область только для чтения и инициализированная область чтения-записи. За экземпляр строки, определенной char s [] = "hello world" в C и C Оператор наподобие int debug = 1 вне «main» будет храниться в инициализированная область чтения-записи. И оператор C, как const char * string = "Привет мир" делает строку буквально "Привет мир" для хранения в инициализированная область только для чтения и строка переменной указателя символов в инициализированной области чтения-записи. Пример: static int i = 10 будет сохранено в сегменте данных и глобальный int i = 10 будет храниться в сегменте данных

2 голосов
/ 16 сентября 2011

Константные строки обычно помещаются с программным кодом, который не является ни кучей, ни стеком (это деталь реализации).Будет существовать только одна копия, каждый раз, когда функция возвращает, она будет возвращать одно и то же значение указателя (это гарантируется стандартом).Поскольку строка находится в памяти программы, возможно, что она никогда никогда не будет загружена в память, и если вы запустите две копии программы, они будут использовать одну и ту же копию в ОЗУ (это работает только для чтениятолько строки, включая строковые константы в C).

1 голос
/ 16 сентября 2011

Ни в куче, ни в стеке, это часть так называемой секции init в исполняемом образе (COFF). Это загружается в память и содержит такие вещи, как строки.

1 голос
/ 16 сентября 2011

Ни то, ни другое в статическом разделе программы.Аналогично наличию строки в качестве глобальной переменной.Внутри единицы перевода всегда есть только одна копия строки.

...