返回值优化

    技术2025-02-06  15

     

     

     

    // CmdLine.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" const int kMillion = 1000; class Complex1 { public: Complex1() {} Complex1(double r, double i) { r_ = r; i_ = i; } Complex1& operator=(const Complex1& rhs) { r_ = rhs.r_; i_ = rhs.i_; return *this; } friend Complex1 operator+(const Complex1& a, const Complex1& b); double r_; double i_; }; Complex1 operator+(const Complex1& a, const Complex1& b) { Complex1 ret; ret.r_ = a.r_ + b.r_; ret.i_ = a.i_ + b.i_; return ret; } class Complex2 { public: Complex2() {} Complex2(double r, double i) { r_ = r; i_ = i; } Complex2& operator=(const Complex2& rhs) { r_ = rhs.r_; i_ = rhs.i_; return *this; } friend Complex2 operator+(const Complex2& a, const Complex2& b); double r_; double i_; }; Complex2 operator+(const Complex2& a, const Complex2& b) { return Complex2(a.r_ + b.r_, a.i_ + b.i_); } #include "tick_counter.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { for (int i = 0; i < 10; ++i) { Complex1 a(1, 0); Complex1 b(2, 0); Complex1 c; TickCounter counter1; counter1.start(); for (int i = 0; i < kMillion; ++i) { c = a + b; } unsigned __int64 time1 = counter1.stop(); cout << time1 << " r " << c.r_ << " i " << c.i_ << endl; Complex2 d(1, 0); Complex2 e(2, 0); Complex2 f; TickCounter counter2; counter2.start(); for (int i = 0; i < kMillion; ++i) { f = d + e; } unsigned __int64 time2 = counter2.stop(); cout << time2 << " r " << f.r_ << " i " << f.i_ << endl; cout << "==========================" << endl; } getchar(); return 0; }  

    VC 2008:

    Debug版 效率Complex1 < Complex3 < Complex2

    Rlease版 看不出明显区别

     

    优化建议

    1. 不要在返回对象的函数体内定义由于返回的临时对象

    2. 尽量用构造函数返回,Computational Constructor会带来一定的效率损失。

    3. 必须定义复制构造函数。

    最新回复(0)