C++ 知識點
內聯函數inline
- inline 和 宏定義#define的作用基本類似,都是替換或者展開。 在程序編譯階段,如果遇到內聯函數,則將內聯函數的實現在當前位置展開。內聯的目的是爲了減少函數的調用開銷,從而提高運行效率,但會增加代碼體量。
內聯函數的優缺點
優點:
(1)通過避免函數的回調,加速了程序的執行;
(2) 通過利用指令緩存,增強局部訪問性;
(3)使用內聯可以替換重複的短代碼,方便代碼管理;
缺點:
(1) 由於是替換展開,因此會增大代碼體量;
(2)一旦修改內聯,所有用到該內聯的地方都需要重新編譯;
內聯函數與宏的區別
(1)內聯函數可調試,而宏定義不行;
(2)內聯函數首先是函數,函數的很多性質都適用於內聯函數,如:內聯函數可以重載;編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會;
(3)內聯函數可以訪問類的私有成員變量,宏定義則不能;
static的用法詳解
1. 靜態局部變量:用於函數體內部修飾變量,這種變量的生存期長於該函數。
int foo() {
static int i = 1; //在調用的第一次進行初始化,之後調用不再初始化
return i;
}
//跟定義一個全局變量有什麼區別呢,同樣是初始化一次,連續調用foo()的結果是一樣的,
//但是,使用全局變量的話,變量就不屬於函數本身了,不再僅受函數的控制,
//給程序的維護帶來不便。靜態局部變量正好可以解決這個問題。
//靜態局部變量保存在全局數據區,而不是保存在棧中,每次的值保持到下一次調用,
//直到下次賦新值。
2.靜態全局變量:定義在函數體外,用於修飾全局變量,表示該變量只在本文件可見。
3.靜態函數:準確的說,靜態函數跟靜態全局變量的作用類似:(不能被其它文件所用;其它文件中可以定義相同名字的函數,不會發生衝突;)
4.靜態數據成員:用於修飾 class 的數據成員,即所謂“靜態成員”。這種數 據成員的生存期大於 class 的對象(實體 instance)。靜態數據成員是每個 class 有一份,普通數據成員是每個 instance 有一份,因此靜態數據成員也叫做類變量,而普通數據成員也叫做實例變量。
5.靜態成員函數:用於修飾 class 的成員函數。
(1)調用靜態成員函數,可以用成員訪問操作符(.)和(->)爲一個類的對象或指向類對象的指針調用靜態成員函數,也可以用類名::函數名調用
(2) 靜態成員函數不能訪問非靜態數據和調用非靜態函數,非靜態成員函數可以訪問靜態數據。
Volatile
volatile的本意是“易變的” 因爲訪問寄存器要比訪問內存單元快的多,所以編譯器一般都會作減少存取內存的優化,但有可能會讀髒數據。當要求使用volatile聲明變量值的時候,系統總是重新從它所在的內存讀取數據
C++ 中 struct 和 class
struct 更適合看成是一個數據結構的實現體,class 更適合看成是一個對象的實現體。
最本質的一個區別就是默認的訪問控制
默認的繼承訪問權限。struct 是 public 的,class 是 private 的。
左值與右值
最早是從C語言繼承而來的。在C語言,或者繼承版本的解釋
- 左值是可以位於賦值運算符 = 左側的表達式(當然,左值也可以位於 = 的右側),而
- 右值是不可以位於賦值運算符 = 左側的表達式。
根據《C++ Primer》的說法,左值和右值可以這樣區分:
-
一個表達式是左值還是右值,取決於我們使用的是它的值還是它在內存中的位置(作爲對象的身份)。也就是說一個表達式具體是左值還是右值,要根據實際在語句中的含義來確定。
(通俗的左值的定義就是非臨時對象,那些可以在多條語句中使用的對象。所有的變量都滿足這個定 義,在多條代碼中都可以使用,都是左值。右值是指臨時的對象,它們只在當前的語句中有效)
左值和右值的語法符號:左值的聲明符號爲”&”, 爲了和左值區分,右值的聲明符號爲”&&”。
新特性的目的
右值引用 (Rvalue Referene) 是 C++ 新標準 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它實現了轉移語義 (Move Sementics) 和精確傳遞 (Perfect Forwarding)。它的主要目的有兩個方面:
消除兩個對象交互時不必要的對象拷貝,節省運算存儲資源,提高效率。
能夠更簡潔明確地定義泛型函數。
details: https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/index.html
虛函數
C++中的虛函數(表)實現機制以及用C語言對其進行的模擬實現: https://blog.twofei.com/496/
智能指針
- shared_ptr:多個智能指針可以共享同一個對象,對象的最末一個擁有着有責任銷燬對象,並清理與該對象相關的所有資源。
- weak_ptr:允許你共享但不擁有某對象,一旦最末一個擁有該對象的智能指針失去了所有權,任何weak _ptr 都會自動成空
- unique_ptr: 是一種在異常時可以幫助避免資源泄漏的智能指針。採用獨佔式擁有,意味着可以確保一個對象和其相應的資源同一時間只被一個 pointer 擁有。一旦擁有着被銷燬或編程 empty,或開始擁有另一個對象,先前擁有的那個對象就會被銷燬,其任何相應資源亦會被釋放