Емкость по умолчанию std :: string? - PullRequest
8 голосов
/ 31 января 2012

Когда я создаю std::string с использованием конструктора по умолчанию, выделяется ли ЛЮБАЯ память в куче?Я надеюсь, что ответ не зависит от реализации и стандартизирован.Учтите следующее:

std::string myString;

Ответы [ 5 ]

8 голосов
/ 31 января 2012

К сожалению, нет ответа в соответствии с N3290.

В таблице 633 указано:

  • data() ненулевой указатель, который можно копировать и который может иметь 0 добавленных
  • size() 0
  • capacity() неопределенное значение

Таблица идентична для C ++ 03.

3 голосов
/ 31 января 2012

Нет, , но , и я не знаю ни одной реализации, которая по умолчанию выделяет память в куче.Однако некоторые из них включают в себя то, что называется оптимизацией короткой строки (SSO), где они выделяют некоторое пространство как часть самого строкового объекта, при условии, что вам не нужна больше этой длины (кажется, что между 10и, как правило, 20 символов) это может вообще избежать отдельного выделения кучи.

Это также не стандартизировано.

3 голосов
/ 31 января 2012

Это зависит от реализации.Некоторые реализации строк используют небольшое количество автоматически выделяемого хранилища для небольших строк, а затем динамически выделяют больше для больших строк.

0 голосов
/ 31 января 2012

Обычно да они выделяют память в куче. Я приведу пример: c_str() требует завершающего символа NULL '\ 0'. В большинстве реализаций этот NUL \0 выделяется заранее как часть строки. Таким образом, вы получите как минимум один байт, часто больше.

Если вам действительно нужно определенное поведение, я бы посоветовал написать свой собственный класс. Классы буфера / строки не так сложны для написания.

0 голосов
/ 31 января 2012

Это зависит от компилятора.Посмотрите здесь, есть хорошее объяснение:

http://www.learncpp.com/cpp-tutorial/17-3-stdstring-length-and-capacity/

...