假设我有一个函数可以得到const string&
作为其输入,例如:
void foo(const string& s);
然后我有一个内部缓冲区const char* buffer;
我知道它的大小。
我认为如果我内联创建字符串,仍然会发生一份副本:
foo(string(buffer, n));
但是不需要复制缓冲区,因为所有事情都是不变的,我只需要字符串类的功能而不是它创建的缓冲区。
我必须提到,我不确定复制是否发生,但是看看字符串的构造函数他们都说复制会发生。我不知道编译器优化是否可以理解这种情况,并且我找不到一种方法来确保复制是否发生。
有什么方法可以使用字符串的外部缓冲区,或者至少有一种方法可以确保复制是否发生。我目前正在使用 std string 和 c++11。
是的,抄袭总是在发生。顺便说一句,你不需要包装std::string(buffer)
作为构造函数std::string(char const*)
是隐式且简单的
foo(buffer);
会隐式地将缓冲区复制到字符串中。如果您是作者foo
你可以添加一个重载
void foo(char const*)
这避免了复制。然而,C 字符串面临着 null 终止符是字符串 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);
}
实例(在 C++14 模式下需要 libstdc++ 4.9 或更高版本)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)