泛型编程-转移构造函数(Generic Programming: Move Constructor)

1 引言

我相信大家很了解,创建、复制和销毁临时对象是C++编译器最爱的户内运动。不幸的是,这些行为会降低C++程序的性能。确实,临时对象通常被视为C++程序低效的第一因素[1]。

下面的代码是正确的:

vector < string > ReadFile();
vector < string > vec = ReadFile();

或者

string s1, s2, s3;
//...
s1 = s2 + s3;

但是,如果关心效率,则需要限制类似代码的使用。ReadFile()和operator+创建的临时对象分别被复制然后再废弃。这是一种浪费!

为了解决这个问题,需要一些不太优雅的约定。例如,可以按照引用传递函数参数:

void ReadFile(vector < string > & dest);
vector < string > dest;
ReadFile(dest);

这相当令人讨厌。更糟的是,运算符没有这个选择,所以如果想高效的处理大对象,程序员必须限制创建临时对象的运算符的使用:

string s1, s2, s3;
//...
s1 = s2;
s1 += s3;

这种难缠的手法通常减缓了设计大程序的大团队的工作效率,这种强加的持续不断的烦恼扼杀了编写代码的乐趣而且增加了代码数量。难道从函数返回值,使用运算符传递临时对象,这样做是错误的吗?

一个正式的基于语言的解决方案的提议已经递交给了标准化委员会[2]。Usenet上早已引发了大讨论,本文也因此在其中被反复讨论过了。

本文展示了如何解决C++存在的不必要的复制问题的方法。没有百分之百让人满意地解决方案,但是一个干净的程度是可以达到的。让我们一步一步的来创建一个强有力的框架,来帮助我们从程序中消除不需要的临时对象的复制。这个解决方案不是百分之百透明的,但是它消除了所有的不需要的复制,而且封装后足以提供一个可靠的替代品,直到多年以后,一个干净的、基于语言的标准化的实现出现。

时间: 2024-08-03 11:46:17

泛型编程-转移构造函数(Generic Programming: Move Constructor)的相关文章

C++11新特性:右值引用和转移构造函数

问题背景   [cpp] view plaincopy   #include <iostream>       using namespace std;       vector<int> doubleValues (const vector<int>& v)   {       vector<int> new_values( v.size() );       for (auto itr = new_values.begin(), end_itr 

详解C++中对构造函数和赋值运算符的复制和移动操作_C 语言

复制构造函数和复制赋值运算符从 C++ 11 中开始,该语言支持两种类型的分配:复制赋值和移动赋值. 在本文中,"赋值"意味着复制赋值,除非有其他显式声明. 赋值操作和初始化操作都会导致对象被复制. 赋值:在将一个对象的值赋给另一个对象时,第一个对象将复制到第二个对象中. 因此, Point a, b; ... a = b; 导致 b 的值被复制到 a 中. 初始化:在以下情况下将进行初始化:声明新对象.参数通过值传递给函数或值通过值从函数返回. 您可以为类类型的对象定义"复

浅析C++11中的右值引用、转移语义和完美转发_C 语言

1. 左值与右值:     C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:可以取地址的,有名字的,非临时的就是左值;不能取地址的,没有名字的,临时的就是右值.     可见立即数,函数返回的值等都是右值;而非匿名对象(包括变量),函数返回的引用,const对象等都是左值.     从本质上理解,创建和销毁由编译器幕后控制的,程序员只能确保在本行代码有效的,就是右值(包括立即数);而用户创建的,通过作用域规则可知其生存期的,就是左值(包括函数返回的局部变量的引用以及const对象)

Boost中应用的泛型编程技术

1.何谓泛型编程 泛型编程(Generic Programming)关注于产生通用的软 件组件,让这些组件在不同的应用场合都能很容易地重用.在C++中,类模板和函 数模板是进行泛型编程极为有效的机制.有了这两大利器,我们在实现泛型化的 同时,并不需要付出效率的代价. 作为泛型编程的一个简单例子,让我们 看一下在C库中如何让memcpy()函数泛型化.一种实现方法可能是这样的: void* memcpy(void* region1, const void* region2, size_t n) {

泛型编程与设计新思维

前言 永远记住,编写代码的宗旨在于简单明了,不要使用语言中的冷僻特性,耍小聪明,重要的是编写你理解的代码,理解你编写的代码,这样你可能会做的更好. 1998年,国际C++标准正式通过,标准化对C++最重要的贡献是:对"强大的抽象概念"给于更有力的支持,以降低软件的复杂度,C++提供了二种功能强大的抽象方法:面向对象编程与泛型编程.面向对象编程大家一定很熟悉了,这里就不再哆嗦了.提到泛型编程(Generic Programming),有的人可能还不太熟悉,但是提到STL,你就一定会有所耳

泛型编程:再现Min和Max

在1995年1月,Scott Meyers 在C++ Report杂志上就强调"min,max 对C++社团来说是一个很大的挑战",他对基于macro-based实现的min,max进行认真的分析,对照基于模板的min,max实现,他得到了如下结论: "对于实现max,什么是最好的方法?"用一句Tevye的名言:"我将告诉你:我不知道",基于以上分析,我有信心告诉大家宏实现的方法,也许是最好的,不过,我个人很讨厌:宏.因此,大家如果有什么更好的实

漫谈C++11利器之右值引用(move语义&amp;Perfect Forwarding)

该文章来自阿里巴巴技术协会(ATA) 作者:空溟  C++11(2011)标准推出已经很长时间了,最接地气的特性就要属"右值引用"了(Rvalue Reference),它实现了move语义和完美转发(Perfect Forwarding),一开始觉得不好理解,所以一直想对其做一个总结.网上也有很多牛人已经做了细致的分析,但基本都是讲原理的多,本文就从Rvalue Reference引入动机入手,举例说明右值引用的使用场景,从而引出move语义和完美转发. 1. 右值引用动机: 从一个

《数学与泛型编程:高效编程的奥秘》一第1章 内容提要

第1章 内 容 提 要 不懂数学,就无法了解世界. --罗吉尔·培根(Roger Bacon),<大著作>(Opus Majus) 这是一本谈编程的书,但是它与大多数的编程书都不太一样,因为除了算法和代码之外,本书还会给出数学证明和一些讲述从古代到20世纪各种数学发现的历史材料. 另一个更为具体的特色在于:这是一本谈论泛型编程(generic programming)的书.泛型编程是出现于20世纪80年代的编程方法,在20世纪90年代随着C++标准模板库(Standard Template L

c++声明结构体指针变量提示没有构造函数错误

问题描述 c++声明结构体指针变量提示没有构造函数错误 ##在OJ中做题 ###题目描述 输入一个链表,从尾到头打印链表每个节点的值. 我的代码: // struct ListNode { // int val; // struct ListNode *next; // ListNode(int x) : // val(x), next(NULL) { // } // }; class Solution { public: vector<int> printListFromTailToHead