С++ максимальная длина std::string определяется размером стека или размером кучи?

как задано в вопросе.
std::string myVar; максимальный символ, который он может содержать, определяется стеком или кучей?

Спасибо


person eugene    schedule 08.04.2011    source источник


Ответы (2)


По умолчанию память, выделенная для std::string, выделяется динамически.

Обратите внимание, что std::string имеет функцию max_size(), возвращающую максимальное количество символов, поддерживаемое реализацией. Однако полезность этого сомнительна, поскольку это максимум реализации и не учитываются другие ресурсы, такие как память. Ваш реальный предел намного ниже. (Попробуйте выделить 4 ГБ непрерывной памяти или примите во внимание исчерпание памяти в другом месте.)

person GManNickG    schedule 08.04.2011
comment
ах, я думал, что это будет ограничено стеком, потому что это похоже на любую другую локальную переменную. Я предполагаю, что любой объект std:: размещается в куче? - person eugene; 08.04.2011
comment
@Eugene: нет, myVar выделено в стеке, однако оно содержит внутренний буфер для хранения строки, которая выделена в куче (в общем). Контейнеры std обычно принимают параметр Allocator, который отвечает за выделение ресурсов и обычно размещает их в куче, хотя (теоретически) он может выделять ресурсы в стеке. - person Matthieu M.; 08.04.2011
comment
@Eugene, это зависит от того, но для контейнеров да, данные обычно находятся в куче. вы всегда можете взломать распределитель, чтобы использовать стек (bleh). - person Anycorn; 08.04.2011
comment
тогда другой связанный с этим вопрос: передача std::string функции путем копирования скопирует держатель и внутренний буфер для хранения фактических символов? - person eugene; 08.04.2011
comment
@Eugene - копирование строки означает копирование всего. Некоторые реализации пытаются отложить копирование внутренних элементов строки (копирование при записи), но это выходит из моды. Более новые реализации хранят небольшие строки внутри строкового объекта и выделяют динамическую память только в том случае, если длина строки превышает определенный размер. - person Bo Persson; 08.04.2011
comment
Когда я увидел max_size, я ошибочно принял его за max_size, установленный пользователем, поэтому немного полезнее рассматривать его как программу: stackoverflow.com/questions/1521281/ - person Nav; 28.03.2013

Объект std::string будет размещен так же, как должен быть int или любой другой тип: в стеке, если это локальная переменная, или это может быть static, или в куче, если используется new std::string или new X, где X содержит string и т. д. .

Но этот объект std::string может содержать как минимум указатель на дополнительную память, предоставленную распределителем, с которым был создан экземпляр basic_string‹> — для std::string typedef это означает память, выделенную в куче. Либо непосредственно в исходной памяти объектов std::string, либо в куче, на которую указывает указатель, вы можете найти:

  • элемент размера строки,
  • возможно, какой-то счетчик ссылок или ссылок,
  • текстовые данные, которые хранит строка (если есть)

Некоторые реализации std::string имеют оптимизацию "короткой строки", когда они упаковывают строки всего из нескольких символов непосредственно в сам строковый объект (для эффективности использования памяти часто используется какое-то объединение с полями, которые используются для других целей, когда строки длиннее). Но для других реализаций строк и даже для тех, у кого оптимизирована короткая строка, при работе со строками, которые слишком длинны, чтобы поместиться непосредственно в объект std::string, им придется следовать указателям/ссылкам на текстовые данные, которые хранятся в памяти, предоставленной распределителем (куче).

person Tony Delroy    schedule 08.04.2011