将 char * 传递给字符串时发生复制吗?

问题描述 投票:0回答:1

我需要调用一个函数,其参数是字符串类型。

我认为

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
)?有什么好的建议可以避免复制吗?

c++ string stl
1个回答
0
投票

aa
是一个
char
数组,而不是
std::string
,因此临时
std::string
对象是构造函数,通过引用(如
s
)传递到
test_string

当构造这个临时对象时,就会创建一个副本。

如果将

aa
更改为
std::string
,则不会进行任何复制,而是通过引用传递。

或者更改

test_string
以接受
string_view
。 A
string_view
在构造时不会复制。

© www.soinside.com 2019 - 2024. All rights reserved.