c++ - 在不复制的情况下为字符串使用外部缓冲区

标签 c++ string c++11 string-view

假设我有一个函数将 const string& 作为其输入,例如:

void foo(const string& s);

然后我有一个内部缓冲区 const char* buffer; 我知道它的大小。

我认为如果我创建内联字符串,仍然会发生一个拷贝:

foo(string(buffer, n));

但是不需要复制缓冲区,因为所有的东西都是常量,我只需要字符串类的功能而不是它创建的缓冲区。

我必须提一下,我不确定复制是否发生,但看看 constructor of string他们都说复制会发生。我不知道编译器优化是否可以理解这种情况,我也找不到一种方法来确定复制是否发生。

有没有办法为字符串使用外部缓冲区,或者至少有一种方法可以确保复制是否发生。我目前正在使用 std string 和 c++11。

最佳答案

是的,复制总是在发生。顺便说一句,你不需要包装 std::string(buffer) 因为构造函数 std::string(char const*) 是隐式的并且很简单

foo(buffer);

会将缓冲区隐式复制到字符串中。如果您是 foo 的作者,您可以添加重载

void foo(char const*)

避免复制。然而,C 字符串存在一个问题,即空终止符是字符串 API 的一部分,因此如果不改变底层字符串(a la 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);
}

Live Example (在 C++14 模式下需要 libstdc++ 4.9 或更高版本)。

关于c++ - 在不复制的情况下为字符串使用外部缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703038/

相关文章:

c++ - 使用模板参数添加数据

c++ - 对 NOSQL DB 的建议以及稳定的 C++ 客户端

c++ - 为什么在全局范围和命名空间 std 中都定义了 size_t?

c++ - 如何从 C++ 中的一串科学数字中删除后面的零

c++ - 为什么 STL::list 复制添加到列表中的元素?

c# - 检测字符串是否有小数

android - 将字符串转换为 TextView

python - 属性错误 : 'str' object has no attribute 'items'

c++ - std::atomic::is_always_lock_free = true 到底是什么意思?

c++ - 在 header 中转发声明 constexpr 函数