effective c++條款30:透徹瞭解inlining的裡裡外外
inline函式的優點:
1. 避免了函式呼叫帶來的額外開銷(inline函式相當於巨集定義,在編譯期就被替換到呼叫處)。
2. 編譯器會對inline函式進行最優化。
inline函式的缺點:
1. 如果inline函式過大並且多次呼叫,會造成可執行檔案體積恐怖的增大。
2. 檔案體積增大也會導致額外的換頁行為,降低了命中率。
3. inline函式無法被除錯。
4. 被inline的函式無法隨著程式庫的升級而升級,如果inline函式需要被更新,那麼客戶的可執行檔案需要被重新編譯。
Get:
1. 編譯器拒絕inline virtual函式;
2. 一個空的構造和解構函式看似可以inline,實際其中會包含一些由編譯器產生的程式碼,所以構造和析構不是inline好的選擇;
3. 即使編譯器可以inline某個函式,但如果你在程式中呼叫了函式指標指向該函式,那麼這個函式也不會被inline,因為編譯器需要為該函式實現一個本體才能進行指標操作。
4. 記住80-20法則,選擇那些%20的程式碼去想辦法inline或者優化,而不是那%80,對那些程式碼優化那是徒勞的。
相關推薦
effective c++條款30:透徹瞭解inlining的裡裡外外
inline函式的優點: 1. 避免了函式呼叫帶來的額外開銷(inline函式相當於巨集定義,在編譯期就被替換到呼叫處)。 2. 編譯器會對inline函式進行最優化。 inline函式的缺點: 1. 如果inline函式過大並且多次呼叫,會造成可執行檔案體積恐怖的增大。 2
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++條款22:將成員變數宣告為private
將成員變數宣告為private的三大理由: 1. 提供語法一致性: 如果將所有的變數都宣告為private,那麼當其他人使用這個類時,就不用糾結是以函式方式呼叫還是變數方式呼叫,更加節省時間。 #include <iostream> using namespa
effective c++條款21:必須返回物件時,別忘想返回其reference
在條款20,我們討論了pass-by-value與pass-by-reference-to-const的傳參效率問題,結果是對於自定義型別,pass-by-reference-to-const方式往往更加高效,那麼我們就會想到,如果返回值也