как задано в вопросе.
std::string myVar; максимальный символ, который он может содержать, определяется стеком или кучей?
Спасибо
как задано в вопросе.
std::string myVar; максимальный символ, который он может содержать, определяется стеком или кучей?
Спасибо
По умолчанию память, выделенная для std::string
, выделяется динамически.
Обратите внимание, что std::string
имеет функцию max_size()
, возвращающую максимальное количество символов, поддерживаемое реализацией. Однако полезность этого сомнительна, поскольку это максимум реализации и не учитываются другие ресурсы, такие как память. Ваш реальный предел намного ниже. (Попробуйте выделить 4 ГБ непрерывной памяти или примите во внимание исчерпание памяти в другом месте.)
myVar
выделено в стеке, однако оно содержит внутренний буфер для хранения строки, которая выделена в куче (в общем). Контейнеры std обычно принимают параметр Allocator
, который отвечает за выделение ресурсов и обычно размещает их в куче, хотя (теоретически) он может выделять ресурсы в стеке.
- person Matthieu M.; 08.04.2011
Объект std::string
будет размещен так же, как должен быть int
или любой другой тип: в стеке, если это локальная переменная, или это может быть static
, или в куче, если используется new std::string
или new X
, где X
содержит string
и т. д. .
Но этот объект std::string
может содержать как минимум указатель на дополнительную память, предоставленную распределителем, с которым был создан экземпляр basic_string‹> — для std::string
typedef
это означает память, выделенную в куче. Либо непосредственно в исходной памяти объектов std::string
, либо в куче, на которую указывает указатель, вы можете найти:
Некоторые реализации std::string
имеют оптимизацию "короткой строки", когда они упаковывают строки всего из нескольких символов непосредственно в сам строковый объект (для эффективности использования памяти часто используется какое-то объединение с полями, которые используются для других целей, когда строки длиннее). Но для других реализаций строк и даже для тех, у кого оптимизирована короткая строка, при работе со строками, которые слишком длинны, чтобы поместиться непосредственно в объект std::string, им придется следовать указателям/ссылкам на текстовые данные, которые хранятся в памяти, предоставленной распределителем (куче).