Еще пара замечаний по управлению памятью:
Строки C являются типами POD, поэтому они могут быть размещены в сегменте данных только для чтения вашего приложения. Если вы объявите и определите std::string
константы в области имен, компилятор сгенерирует дополнительный код, который выполняется до main()
, который вызывает конструктор std::string
для каждой константы. Если в вашем приложении много константных строк (например, если вы сгенерировали код C ++, который использует константные строки), в этой ситуации предпочтительнее использовать строки C.
Некоторые реализации std::string
поддерживают функцию под названием SSO («оптимизация коротких строк» или «оптимизация небольших строк»), где класс std::string
содержит хранилище для строк до определенной длины. Это увеличивает размер std::string
, но часто значительно уменьшает частоту распределения / освобождения свободного хранилища, улучшая производительность. Если ваша реализация std::string
не поддерживает единый вход, то создание пустого std::string
в стеке все равно будет выполнять выделение свободного хранилища. Если это так, то использование временных строк C, выделенных в стеке, может быть полезно для критичного к производительности кода, который использует строки. Конечно, вы должны быть осторожны, чтобы не выстрелить себе в ногу, когда вы делаете это.