Используйте внешний буфер для строки без копирования

Предположим, что у меня есть функция, которая получает const string& в качестве входных данных, например:

void foo(const string& s);

И тогда у меня есть внутренний буфер const char* buffer; который я знаю размер этого.

Я думаю, что если я создаю строку, все еще одна копия произойдет:

foo(string(buffer, n));

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

Я должен упомянуть, что я не уверен, что копия происходит или нет, но, глядя на конструктор строки все они сказали, что это произойдет. Я не знаю, может ли оптимизация компилятора понять такие ситуации или нет, и я не смог найти способ убедиться, что копирование произошло или нет.

Есть ли способ использовать внешний буфер для строки или хотя бы способ убедиться, что копирование происходит или нет. Я использую стандартную строку и C ++ 11 в настоящее время.

3

Решение

Да, копирование всегда происходит. Кстати, вам не нужно оборачивать 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).

7

Другие решения

Нет, std::string управляет своими буферами. Вы не можете иметь строку, используя внешний буфер. На вашем образце в данный момент вы делаете string(buffer, n) это НЕ означает, что ваш экземпляр строки будет владеть вашим buffer и использовать его как строку, но вместо этого он просто скопирует содержимое buffer к его внутренним буферам.

3

По вопросам рекламы [email protected]