Moh*_*miz 3 c++ string c++11 string-view
假设我有一个函数const string&作为其输入,例如:
void foo(const string& s);
Run Code Online (Sandbox Code Playgroud)
然后我有一个内部缓冲区const char* buffer;,我知道它的大小.
我想如果我创建字符串内联,仍然会发生一个副本:
foo(string(buffer, n));
Run Code Online (Sandbox Code Playgroud)
但是没有必要复制缓冲区,因为所有东西都是常量,我只需要字符串类的功能而不是它创建的缓冲区.
我必须提到我不确定复制是否发生,但是查看字符串的构造函数,所有人都说复制会发生.我不知道编译器优化是否可以理解这种情况,我找不到确定复制是否发生的方法.
有没有办法为字符串使用外部缓冲区,或者至少是确保复制发生与否的方法.我目前正在使用std字符串和c ++ 11.
是的,复制总是在发生.顺便说一下,你不需要包装,std::string(buffer)因为构造函数std::string(char const*)是隐式的而且很简单
foo(buffer);
Run Code Online (Sandbox Code Playgroud)
将隐式地将缓冲区复制到字符串中.如果您是作者,则foo可以添加过载
void foo(char const*)
Run Code Online (Sandbox Code Playgroud)
这避免了复制.但是,C字符串遇到的问题是null终止符是字符串API的一部分,因此您无法在不改变底层字符串的情况下轻松创建子字符串(a la strtok).
Library Fundamentals技术规范包含一个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);
}
Run Code Online (Sandbox Code Playgroud)
实例(在C++ 14模式下需要libstdc ++ 4.9或更高版本).
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |