gpt4 book ai didi

c++ - 是否可以在 C++ 中进行返回交换,而不是按值返回?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:22 26 4
gpt4 key购买 nike

假设我正在用 C++ 编写一个字符串类(我知道我可以使用该库)。字符串长度可变,存储空间在构造函数中动态分配,在析构函数中释放。当main函数调用c=a+b时(a,b,c为字符串),operator+成员函数创建一个临时对象存储连接后的字符串a+b,返回给main函数,然后operator=成员函数调用释放原先存放在c中的字符串,并将数据从临时字符串a+b复制到c,最后是临时a+b 被破坏了。

我想知道是否有办法实现这一点:而不是让 operator= 将数据从 a+b 复制到 c,我想让它交换a+bc的数据指针,这样当a+b被析构时,它就析构c 中的原始数据(这是我们想要的),而 c 现在无需复制即可获取 a+b 的结果。

我知道编写一个 2 参数成员函数 setToStrcat 并调用 c.setToStrcat(a,b) 可以做到这一点。例如,函数可以编码为:

    void String::setToStrcat(const String& a,const String& b){
String tmp(a.len+b.len); int i,j;
for(i=0;i<a.len;i++) tmp[i]=a[i];
for(j=0;j<b.len;i++,j++) tmp[i]=b[j];
tmp[i]='\0'; this->swap(tmp);
}

void String::swap(String& a){
int n=len; len=a.len; a.len=n;
char *s=str; str=a.str; a.str=s;
}

我省略了构造函数(分配 len+1 字符型空间)和 operator[](返回 i 的引用)的定义 第一个字符)。 swap函数交换*thistmp之间的数据指针和长度变量,这样当tmp被析构时交换后,实际上是*this中原来存储的数据(main函数中的String c)被销毁了。 *this 现在拥有的 (c.str) 是连接的字符串 a+b

我想知道是否有办法将c=a+b的性能优化到同样的水平。我尝试了 c.swap(a+b) 并将 a+b 的返回类型更改为 String&,但我收到警告(引用一个局部变量)并且 GDB 显示临时文件在交换发生之前被破坏,而我想要另一种方式。

我认为我的问题很笼统。在 C++ 编程中,我们经常需要一个临时对象来存储函数的结果,但是当我们在 main 函数中将其分配给另一个对象时,我们是否可以不复制数据而是使用(更快的)指针交换来代替?实现这一目标的巧妙方法是什么?

最佳答案

在 C++11 中,您可以通过编写移动构造函数来完成此操作。右值引用被添加到语言中以解决这个确切的问题。

class String {
...
String(String&& s) : str(nullptr) {
this->swap(s);
}
String& operator=(String&& s) {
this->swap(s);
}
...
String operator+(String const& other) {
// (your implementation of concatenation here)
}
...
}

这样的代码不会触发额外的复制构造函数或内存分配,它只会将分配的内存从临时(从 operator+ 返回的东西)移动到新对象 c

String c = a + b;

关于c++ - 是否可以在 C++ 中进行返回交换,而不是按值返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39114416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com