Effective c++ 條款26:儘可能延後變數定義式的出現時間
只要你定義了一個變數而其型別帶有一個建構函式或解構函式,那麼當程式的控制流到達這個變數定義式時,你便得承受構造成本;當這個變數離開其作用域時,你得承受其析構成本。即使這個變數最終未被使用,仍需要耗費這些成本。
1、儘可能延後變數定義式
例如,當某個變數宣告的程式碼出於一個可能丟擲異常的程式碼段之前,若出現異常,這個變數就未被使用。因此需要將這個變數的定義延後,直到確實需要它。
2、跳過毫無意義的default構造過程,給物件一個初值
你不止應該延後變數的定義,直到非得使用該變數的前一刻為止,甚至應該嘗試延後這份定義直到能夠給它初值實參為止。如果這樣,不僅能夠避免構造和析構非必要物件,還可以避免無意義的default構造行為。
3、如果變數只在迴圈內使用,把它定義於迴圈內
將變數定義於迴圈外,通常需要1個建構函式+1個解構函式+n個賦值操作,而將變數定義於迴圈內,通常需要n個建構函式+n個解構函式。如果classes的一個賦值成本低於一組構造+析構成本,前者大體而言比較高效,尤其當n值很大時,否則應該選擇後者,有時那對程式的可理解性和易維護性造成衝突。
相關推薦
Effective c++ 條款26:儘可能延後變數定義式的出現時間
只要你定義了一個變數而其型別帶有一個建構函式或解構函式,那麼當程式的控制流到達這個變數定義式時,你便得承受構造成本;當這個變數離開其作用域時,你得承受其析構成本。即使這個變數最終未被使用,仍需要耗費這些成本。 1、儘可能延後變數定義式 例如
effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕
ble 這樣的 ive c++ 拒絕 類對象 析構 並且 防止 記住:為防止編譯器暗自提供的功能,可將相應的成員函數聲明為privae並且不予實現。也可以使用Uncopyable這樣的父類實現。 對於獨一無二的對象,希望不支持拷貝構造函數和賦值操作符。 class Hom
effective c++ 條款07:為多態基類聲明virtual析構函數
pub effective atomic water delet () IV del effect 記住:帶多態性質的基類應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。class的設計目的如果不是作為基
effective c++ 條款13:以對象管理
行為 fec ret 拷貝構造函數 AR clas 釋放 AS RR 記住: 為防止資源泄漏,請使用RAII對象,它們在構造函數中獲得資源並在析構函數中釋放資源。 兩個常被使用的RAII類分別是tr1::shared_ptr和auto_ptr。前者通常是較佳選擇,因為其c
effective c++ 條款15:在資源管理類中提供對原始資源的訪問
nth invest AR and effect ptr 比較 c++ 顯示轉換 記住: APIs往往要求訪問原始資源,所以每一個RAII類應該提供一個“取得其所管理之資源”的辦法。 對原始資源的訪問可能經由顯示轉換或隱式轉換。一般而言顯示轉換比較安全,但隱式轉換對客戶比
effective c++ 條款16:成對使用new和delete時要采用相同形式
最好 class 你在 pan TE fec IV line PE 記住: 如果你在new表達式中使用[ ],必須在相應的delete表達式中也是用[ ]。如果你在new時不使用[ ],一定不要在delete時使用[ ]。 string* stringPtr1 = n
effective c++ 條款17:以獨立語句將newd對象置入智能指針
執行 順序 ID 條款17 隱式轉換 ive 遺失 解決 red 記住: 以獨立語句將newd對象存儲於智能指針內。如果不這樣做,一旦異常被拋出,有可能導致難以察覺的資源泄漏。 int priority(); void processWidget(std::tr1::
effective c++ 條款19:設計class猶如設計type
調用 還需要 構造 protected explicit protect cte 操作符 創建 記住: 在定義一個新type之前,確定已經考慮過本條款覆蓋的主題 要設計高效的class,需要回答以下的問題:1. 對象如何去創建和銷毀?這是構造函數和析構函數的問題,當然如
effective c++條款20:寧以pass-by-reference-to-const替換pass-by-value
1. 更高效 考慮如下的一個base class和derived class: class Base { private: std::string name; std::string address; public: Base(){} ~Base(){}
effective c++條款17:以獨立語句將newed物件置入智慧指標
假設有這麼一個函式process,它接收一個MyClass型別的指標與 一個函式,如果按下面的方式呼叫: #include <iostream> #include <memory> using namespace std; class MyClass { p
effective c++條款16:成對使用new和delete時要採取相同形式
下面的程式碼會產生什麼樣的後果? #include <iostream> using namespace std; int main(void) { std::string *StringArray = new std::string[30]; delete StringAr
effective c++條款14:在資源管理類中小心copying行為
對於智慧指標auto_ptr和tr1::shared_ptr,它們在作用域結束時會將所指內容自動刪除。 然而對於某些系統資源,比如互斥鎖(muxex)等並不是在堆中申請的,是長期存在的,只能去釋放,不能將其刪除,這樣,我們就不能用智慧指標去管理它,資源管理類是個好的選擇。 考慮用下面的類
effective c++條款11:在operator=中處理自我賦值
int a = 3; a = a; 這就是自我賦值,你可能覺得這個自我賦值不痛不癢,造成不了什麼後果,那麼下面這個呢? #include <iostream> using namespace std; class MyClass { public: int *p; publ
effective c++條款23:寧以non-member non-friend替換member函式
舉書上的例子: class WevBrowser { public: WevBrowser(){} ~WevBrowser(){} public: void ClearCache(); void ClearHistory(); void RemoveC
effective c++條款24:若所有引數皆需要型別轉換,請為此採用non-member函式
考慮一個有理數的類: class Rational { public: Rational(int nc = 0, int dc = 1):n(nc), d(dc){} ~Rational(){} private: int n, d; //n為分子,d為分母 }; 我們想要實現諸
effective c++條款34:區分介面繼承和實現繼承
1. 純虛擬函式也可以有具體實現 #include <iostream> using namespace std; class Airplane { public: virtual void fly(const char *)const = 0; }; void Airplan
effective c++條款33:避免遮掩繼承而來的名稱
1. using 考慮下面程式: #include <iostream> using namespace std; class Based { public: void Func() { cout << "Base" << endl; }
effective c++條款32:確定你的public繼承塑模出is-a關係
舉書上的例子: class Bird { public: void Fly(); }; class Penguin : public Bird { }; 企鵝也是鳥,但是企鵝並不能飛,也就是說“並不是鳥就能飛”,不滿足is-a關係 再來一個例子: class Person
effective c++條款30:透徹瞭解inlining的裡裡外外
inline函式的優點: 1. 避免了函式呼叫帶來的額外開銷(inline函式相當於巨集定義,在編譯期就被替換到呼叫處)。 2. 編譯器會對inline函式進行最優化。 inline函式的缺點: 1. 如果inline函式過大並且多次呼叫,會造成可執行檔案體積恐怖的增大。 2
effective c++條款22:將成員變數宣告為private
將成員變數宣告為private的三大理由: 1. 提供語法一致性: 如果將所有的變數都宣告為private,那麼當其他人使用這個類時,就不用糾結是以函式方式呼叫還是變數方式呼叫,更加節省時間。 #include <iostream> using namespa