设为首页 加入收藏

TOP

"利用const引用避免复制" (二)
2013-02-08 14:33:01 来源: 作者: 【 】 浏览:702
Tags:" 利用 const 引用 避免 复制  

 

  结果如下:


  从结果看出,swapOne函数使用引用形参成功交换了a,b变量。而swapTwo函数没有交换成功。

  swapTwo使用的是普通的非引用类型的参数,是通过复制对应的实参实现初始化,传递函数的实参没有改变。

  而swapOne中,引用形参直接关联到其绑定的对象,而并非这些对象的副本。所以交换会成功。

  [cpp]

  //比较两个数,如果相同返回0,如果v1大,返回1,如果v2大,返回-1

  int compare(const int &v1, const int &v2)

  {

  if(v1 < v2) return -1;

  if(v2 < v1) return 1;

  return 0;

  }

  上面这例子中的const还有什么作用呢?原来使用const可以避免引用复制,提高性能,swapOne中当然不能使用了,因为它要改变值,而compare函数只是比较两个数的大小,没有交换,所以加上const可以提高性能。因为复制对象需要付出时间和存储空间代价。

  后记:最近无意中看到了《Effective C++(www.cppentry.com)》的条款20"宁以pass-by-reference-to-const 替换 pass-by-value".中也谈到了这个问题。

  [cpp]

  class Person{

  public:

  Person();

  virtual ~Person();

  …

  private:

  std::string name;

  std::string address;

  };

  class Student:public Person{

  public:

  Student();

  ~Student();

  …

  private:

  std::string schoolName;

  std::string schoolAddress;

  }

  假设现在有这样一个函数

  bool validateStudent(Student s);

  如果用by Value方式来调用就是

  Student plato;

  bool platoIsOk = validateStudent(plato);

  因为Student类是继承Person类,每个类都有两个string.书上说,by value方式传递一个Student对象,总体成本是"六次构造函数和六次析构函数"!

  如果改成成pass by reference-to-const:

  bool validateStudent(const Student& s);没有任何构造函数或析构函数被调用,因为没有任何新对象被创建。

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ 协程与网络编程 下一篇颜色对话框使用实例

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: