Максимальная длина std :: string c ++ определяется размером стека или кучи? - PullRequest
6 голосов
/ 08 апреля 2011

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

Спасибо

Ответы [ 2 ]

8 голосов
/ 08 апреля 2011

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

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

2 голосов
/ 08 апреля 2011

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

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

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

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

...