我需要调用一个函数,其参数是字符串类型。
我认为
std::string
是一个不错的选择,因为它提供了很多接口。
但是最近,我发现当我将
char *
传递给const std::string &
时发生了副本。
这是代码:
#include <iostream>
#include <string>
using namespace std;
void test_string(const std::string & s) {
printf("%p\n", s.data());
}
int main() {
char aa[] = "asd";
test_string(aa);
printf("%p\n", aa);
}
如上面的代码所示,我可以将 std::string 和
char []
传递给我的函数 test_string
。
我的arg类型是
const std::string &
,我以为不会发生任何复制。
但是输出显示地址不同,我认为该函数构造了一个临时变量字符串,它是从我的
char []
一一复制的。这是没有必要的。
这是一个不好的用法吗(将
char[]
传递给 std::string
)?有什么好的建议可以避免复制吗?
aa
是一个 char
数组,而不是 std::string
,因此临时 std::string
对象是构造函数,通过引用(如 s
)传递到 test_string
。
当构造这个临时对象时,就会创建一个副本。
如果将
aa
更改为std::string
,则不会进行任何复制,而是通过引用传递。
或者更改
test_string
以接受 string_view
。 A string_view
在构造时不会复制。