C++臨時物件減少的方法
阿新 • • 發佈:2019-01-02
C++臨時物件產生的場景:
1. 值傳遞 2. 函式返回 3. 後置++ 等
減少臨時物件產生的方法:
1. 使用引用或指標傳遞
2. 避免隱式型別轉換
3. 使用 += 代替 +
string x = a + b; // 這裡會產生儲存a+b值的臨時物件
string x(a); x += b; // 這樣就不會產生臨時物件
4. 使用前置++代替後置++
前置++的定義:
type operator++();
後置++的定義:
const type operator++(int);
為了編譯器區分前置和後置++,C++規定字尾形式有一個int型別引數 ,當函式被呼叫時,編譯器傳遞一個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。
class CInt {
private:
int m_value;
};
CInt & CInt:: operator++() // 前置的是沒有引數的,並且返回引用
{
this -> m_value += 1;
return * this;
}
const CInt CInt::operator++(int) //後置的有一個匿名引數,並且返回const值
{
CInt old = * this;
++(*this);
return old;
}
上面的例子很好的解釋了,為什麼前置比後置效率高,後置會產生臨時物件並返回原本的值的原因。
5. 使用匿名臨時物件
#include <iostream> using namespace std; class Teacher { string name; string course; public: Teacher(const char *n,const char *c):name(n),course(c) { cout << "建立" << course << "老師" << name <<endl; } Teacher(const Teacher& t) { name = t.name; course = t.course; cout << "複製" << course << "老師" << name << endl; } ~Teacher() { cout << "辭退" << course << "老師" << name <<endl; } }; int main() { //用臨時匿名物件來初始化一個新物件 //編譯器一般會優化成直接用建立臨時物件的引數來建立新物件 Teacher t1("陳宗權","C++");//建構函式 Teacher t2 = t1;//拷貝建構函式 //少建個物件 少呼叫個拷貝建構函式 //比較多的用的是 函式返回匿名物件 而不是有名字的臨時變數。 Teacher t3 = Teacher("楊強","UC");//直接建立 呼叫建構函式 t2 = t3; //賦值函式 cout << "=======" <<endl; t2 = Teacher("徐薇薇","諮詢"); // 沒有優化 建立匿名物件 呼叫賦值函式 cout << "=======" <<endl; } /* 建立C++老師陳宗權 複製C++老師陳宗權 建立UC老師楊強 ======= 建立諮詢老師徐薇薇 辭退諮詢老師徐薇薇 ======= 辭退UC老師楊強 辭退諮詢老師徐薇薇 辭退C++老師陳宗權 */