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, они должны будут следовать указателям / ссылкам на текстовые данные, которые хранятсяв выделенной (куче) памяти распределителя.