1.是否會產生乙個臨時物件,視編譯器的進取性和**操作發生時的語境而定。c++標準中指出編譯器對臨時性物件有完全的自由度。
2.在新開闢的記憶體上以拷貝的方式構造物件時,幾乎所有編譯器都不會產生乙個臨時性物件。
t c=a+b;//其中加法運算子形式如下:
t operator+(const t&,const t&);//或
t t::operator+(const t &);
上面的表示式可能會通過拷貝建構函式直接將a+b的值放到c中,同時可能會有nrv發生,不會呼叫建構函式和析構函式。然而下面這種情況幾乎確定會產生臨時物件。
c=a+b;//會被轉換為如下偽碼①
t temp;
temp.
operator+(a,b);
c.operator=(temp);
temp.t::~t();
//而不會轉換為這樣②
c.t::~t();
c.t::t(a+b);
這種情況下,不像之前那種情況,不能直接傳遞c到運算子函式中,因為c的記憶體不是一塊新鮮的位址,需要先將其進行清理。而不選則②的原因是,拷貝建構函式、析構函式和拷貝賦值運算子都是可以由使用者提供的,這可能導致①和②的語義不同,所以編譯器會選擇與最初表示式語義最符合的情況①。
3.臨時物件的生存週期
①臨時物件被摧毀應該是對創造該臨時物件的完整表示式求值過程中的最後乙個步驟。但是會有②和③兩個特例
②凡是持有表示式執行結果的臨時物件,應該留存到物件的初始化操作完成為止。
③如果乙個臨時物件被繫結與乙個引用或指標,知道被初始化的引用的生命結束,或直到臨時物件的生命範疇結束,視哪一種情況先到達而定。
4.c++標準沒有規定臨時物件儲存的位置,但是根據上面臨時物件的週期來看,大多數是儲存在**區即棧。
5.臨時物件的產生可能導致大量的記憶體訪問過程,編譯器可以通過反聚合(把複雜的式子標稱很多簡單的式子相加)來提高效率。
C 物件模型 臨時性物件 第六章
如果有乙個函式,形式如下 t operator const t const t 以及兩個t objects,a和b,那麼 a b 可能會導致乙個臨時性物件,以放置傳回的物件.是否會導致乙個臨時性物件,視編譯器的進取性 aggressiveness 以及上述操作發生時的程式上下關係 program c...
mysql第六章 第六章 mysql日誌
第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...
第六章 指標
1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...