是否可以在c中返回交换,而不是按值返回?
假设我在C中编写一个字符串类(我知道我可以使用该库).字符串长度是可变的,存储空间在构造函数中动态分配,并在析构函数中释放.当main函数调用c = ab(a,b,c是字符串)时,运算符成员函数创建一个临时对象,该对象存储连接字符串ab,将其返回给main函数,然后调用operator = member函数释放最初存储在c中的字符串并将数据从临时字符串ab复制到c,最后删除临时ab.
我想知道是否有办法实现这一点:不是让操作符=从ab到c复制数据,我希望它交换ab和c的数据指针,这样当ab被破坏时,它会破坏原始的c中的数据(这是我们想要的),而c现在获取ab的结果而不需要复制. 我知道编写一个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]=' '; 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个char类型的空格)和operator [](它返回了第i个字符的引用).交换函数在* this和tmp之间交换数据指针和长度变量,这样当交换后tmp被破坏时,它实际上是最初存储在* this(主函数中的字符串c)中被破坏的数据.它现在拥有的(c.str)是连接的字符串a b. 我想知道是否有办法将c = a b的性能优化到同一水平.我尝试了c.swap(a b)并将b的返回类型更改为String&,但是我收到警告(引用局部变量),GDB显示临时在交换发生之前被破坏,而我想要另一种方式. 我认为我的问题很笼统.在C编程中,我们经常需要一个临时对象来存储函数的结果,但是当我们将它分配给main函数中的另一个对象时,我们可以不复制数据而是使用(更快)交换指针吗?实现这一目标的巧妙方法是什么? 解决方法
在C 11中,您可以通过编写移动构造函数来完成此操作. Rvalue引用被添加到语言中以解决这个确切的问题.
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) } ... } 那么像这样的代码不会触发额外的复制构造函数或内存分配,它只会将分配的内存从临时(从运算符返回的东西)移动到新对象c. String c = a + b; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |