В моем проекте на С++ я за один шаг до замены всего char*
на std::string
, но я нахожу один случай, когда std::string
терпит неудачу.
Представьте, что у меня есть две функции:
void foo1(const std::string& s)
{
...
}
void foo2(const char* s)
{
...
}
Если я напишу что-то вроде этого:
const char* SL = "Hello to all!";
foo1(SL); // calls malloc, memcpy, free
foo2(SL);
в foo1
SL
будет неявно преобразован в std::string
. Это означает, что конструктор std::string
будет выделять память, и он скопирует строковый литерал в этот буфер. В foo2
, хотя ничего из этого не произойдет.
В большинстве реализаций std::string
предполагается супер оптимизироваться (например, копировать по записи), но когда я построю его с помощью const char*
, это не так. И мой вопрос в следующем: почему это происходит? Я что-то упускаю? Является ли моя стандартная библиотека недостаточно оптимизированной или по какой-либо причине (что я не знаю) это абсолютно небезопасно?