C 中看不見的臨時物件

2021-07-25 12:49:58 字數 958 閱讀 3289

物件導向的程式語言中涉及到物件的建立與銷毀,其中有建構函式與析構函式的呼叫,在建立物件、值拷貝物件等過程中,編譯器會隱含建立一些原始碼中沒有的臨時物件,如果不注意,這些臨時物件會給程式的效能帶來很大的影響。下面介紹二種常見的臨時物件產生環境並給出解決方案:

1、當函式返回乙個物件時,一般情況下會出現臨時變數

class a

const a operator+(const a& a1, const a& a2)

void main(void)

分析:a1+a2返回時,其中的temp已經結束了其生命週期,返回的a物件需要在呼叫a1+a2函式的棧中開闢空間來存放此返回值,這個臨時的a物件是a1+a2返回時通過a拷貝建構函式。在main函式中可以通過a a = a1+a2;來避免產生臨時物件。此時這句是初始化操作,不需要在main空間棧中開闢空間,而是直接使用為a預留的空間。這裡有一條規則:

對非內建物件,盡量將物件的定義延遲到已經確切知道其有效狀態時,以減少臨時物件的生成。

2、當實際呼叫函式傳入的引數和函式定義中宣告變數型別不匹配時,會出現臨時變數

class a

private:

int m,n;

};void func()

a=1此處看似無法通過編譯,但是c++編譯器在判定這種語句不能成功編譯前,會做各種嘗試找到合適轉換路徑,以滿足編譯要求。以是**中編譯器會將1通過呼叫a::a(10, 1)生成乙個臨時物件賦值給a。這種情況可以在建構函式前加上explicit宣告強制開發人員顯式地根據建構函式定義呼叫,而不能做隱式處理。

另外,關於c++某些運算子的效率問題,比如+=、-=、*=、/=、%=,拿+=為例:

......

a & operator+=(const a & a1)

......

void main(void)

對於前置單目運算子++、--同樣也不會產生臨時物件,而後置++、--則會出現臨時物件。

揪出資料庫中看不見的字元

應用報出了異常,發現某錶某字段下的資料多了些字元,但是在資料庫中用sql檢視時不一定能夠發現。這種情況一般是在字元結尾多了空格 製表符 回車符 換行符等造成。可以從資料庫中校驗並修正這些異常資料。特殊字元ascii碼,oracle和mysql中的表示方法 特殊符號 oracle mysql tidb...

「看不見的手」

150年前,隱秘的歐洲金融權貴羅斯切爾德家族保留著一句名言 絕大多數的人民在智力上不足以理解這個系統 支票貨幣和信用貨幣 以及這個系統所衍生出的資本和巨大優勢,他們將承受壓迫而毫無怨言,甚至一點都不會懷疑這個系統損害了他們的利益。多年之後,羅斯切爾德家族的子孫,幾乎控制了所有發達國家的貨幣發行權,掌...

關於假設 看不見的基石

關於假設 看不見的基石 invisible foundation stone 1序我們現在的大多數基礎理論都是建立在一些簡單而明顯的假設之上的。例如在數學領域,在物理學領域,在化學領域 同時也有一些基礎理論因為假設的錯誤或者不夠準確,而被新的理論所代替,或者被擴充套件和修改。例如 第五公設問題 2展...