小编vic*_*ict的帖子

如果我肯定要复制字符串,如何有效地将它传递给函数?C++20

我想知道如何正确处理函数中的字符串输入,如果我知道我将必须在其中创建一个副本以将其放入容器中。

我想这样做:

void foo(const string& s){
    container.push(s);
}
Run Code Online (Sandbox Code Playgroud)

但是如果我传递一个 char* 字符串,我将制作 2 个副本,首先是在调用 foo 时,然后是在将其传递到容器时。

我的第二个想法是使用 string_view,正如人们常说的,如果你可以使用视图,你就应该使用。所以我的函数的第二个版本如下所示:

void foo2(string_view s){
    container.push(string(s));
}
Run Code Online (Sandbox Code Playgroud)

好的,现在无论给我什么类型的字符串,我都会只制作一个副本。但后来我开始思考,为什么我不能接受一个字符串作为函数的参数,像这样简化它:

void foo3(string s){
    container.push(std::move(s));
}
Run Code Online (Sandbox Code Playgroud)

但现在我必须确保我的容器正确利用移动语义,这样它最终不会制作另一个副本!由于此容器对象是模板化类型,因此意味着使用完美转发等,这本身就是大量工作。

目前我不知道该选择哪个选项,所以想请教您一些建议。我还觉得我想得太多了,因为这最终可能不会对性能产生太大影响,但我想做得正确。提前致谢。

c++ std stdstring string-view c++20

5
推荐指数
2
解决办法
313
查看次数

标签 统计

c++ ×1

c++20 ×1

std ×1

stdstring ×1

string-view ×1