В моем проекте на C ++ я за один шаг до того, как заменить все char*
на std::string
, но я нахожу один определенный случай, когда std::string
терпит неудачу.
Представьте, что у меня есть эти 2 функции:
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
предполагается супероптимизированным (например, Copy On Write), но когда я создаю его с const char*
, это не так. И мой вопрос таков: почему это происходит? Я что-то пропустил? Моя стандартная библиотека недостаточно оптимизирована или по какой-то причине (о которой я не знаю) это совершенно небезопасно?