Предположим, что у меня есть функция, которая получает const string&
в качестве входных данных, например:
void foo(const string& s);
И тогда у меня есть внутренний буфер const char* buffer;
который я знаю размер этого.
Я думаю, что если я создаю строку, все еще одна копия произойдет:
foo(string(buffer, n));
Но нет необходимости копировать буфер, потому что все вещи постоянны, и мне просто нужна функциональность строкового класса, а не буфер, который он создает.
Я должен упомянуть, что я не уверен, что копия происходит или нет, но, глядя на конструктор строки все они сказали, что это произойдет. Я не знаю, может ли оптимизация компилятора понять такие ситуации или нет, и я не смог найти способ убедиться, что копирование произошло или нет.
Есть ли способ использовать внешний буфер для строки или хотя бы способ убедиться, что копирование происходит или нет. Я использую стандартную строку и C ++ 11 в настоящее время.
Да, копирование всегда происходит. Кстати, вам не нужно оборачивать std::string(buffer)
как конструктор std::string(char const*)
неявный и простой
foo(buffer);
будет неявно скопировать буфер в строку. Если вы являетесь автором foo
Вы можете добавить перегрузку
void foo(char const*)
что позволяет избежать копирования. Однако строки C страдают от проблемы, заключающейся в том, что нулевой терминатор является частью строкового API, и поэтому вы не можете легко создавать подстроки без изменения базовой строки (а-ля strtok
).
Техническая спецификация Основы библиотеки содержит string_view
класс, который устранит копирование как char const*
, но сохраняет возможность подмножества std::string
#include <iostream>
#include <experimental/string_view>
void foo(std::experimental::string_view v) { std::cout << v.substr(2,8) << '\n'; }
int main()
{
char const* buffer = "war and peace";
foo(buffer);
}
Живой пример (требуется libstdc ++ 4.9 или выше в режиме C ++ 14).
Нет, std::string
управляет своими буферами. Вы не можете иметь строку, используя внешний буфер. На вашем образце в данный момент вы делаете string(buffer, n)
это НЕ означает, что ваш экземпляр строки будет владеть вашим buffer
и использовать его как строку, но вместо этого он просто скопирует содержимое buffer
к его внутренним буферам.