C 常见的面试知识点(下)
inline 內聯函數的特征
相當于把內聯函數里面的內容寫在調用內聯函數處;
相當于不用執行進入函數的步驟,直接執行函數體;
相當于宏,卻比宏多了類型檢查,真正具有函數特性;
編譯器一般不內聯包含循環、遞歸、switch 等復雜操作的內聯函數;
在類聲明中定義的函數,除了虛函數的其他函數都會自動隱式地當成內聯函數。
優點
內聯函數同宏函數一樣將在被調用處進行代碼展開,省去了參數壓棧、棧幀開辟與回收,結果返回等,從而提高程序運行速度。內聯函數相比宏函數來說,在代碼展開時,會做安全檢查或自動類型轉換(同普通函數),而宏定義則不會。在類中聲明同時定義的成員函數,自動轉化為內聯函數,因此內聯函數可以訪問類的成員變量,宏定義則不能。內聯函數在運行時可調試,而宏定義不可以。
缺點
代碼膨脹。內聯是以代碼膨脹(復制)為代價,消除函數調用帶來的開銷。如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。另一方面,每一處內聯函數的調用都要復制代碼,將使程序的總代碼量增大,消耗更多的內存空間。inline 函數無法隨著函數庫升級而升級。inline函數的改變需要重新編譯,不像 non-inline 可以直接鏈接。是否內聯,程序員不可控。內聯函數只是對編譯器的建議,是否對函數內聯,決定權在于編譯器。
volatile 作用
比如:volatile int i = 10;
1,volatile 關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素(操作系統、硬件、其它線程等)更改。所以使用 volatile 告訴編譯器不應對這樣的對象進行優化。,
2,volatile 關鍵字聲明的變量,每次訪問時都必須從內存中取出值(沒有被 volatile 修飾的變量,可能由于編譯器的優化,從 CPU 寄存器中取值)
3,const 可以是 volatile (如只讀的狀態寄存器)
4,指針可以是 volatile
sizeof()
sizeof 對數組,得到整個數組所占空間大小。
sizeof 對指針,得到指針本身所占空間大小。
#pragma pack(n)
設定結構體、聯合以及類成員變量以 n 字節方式對齊
extern "C"
被 extern 限定的函數或變量是 extern 類型的
被 extern "C" 修飾的變量和函數是按照 C 語言方式編譯和鏈接的
extern "C" 的作用是讓 C 編譯器將 extern "C" 聲明的代碼當作 C 語言代碼處理,可以避免 C 因符號修飾導致代碼不能和C語言庫中的符號進行鏈接的問題。
C 中 struct 和 class
總的來說,struct 更適合看成是一個數據結構的實現體,class 更適合看成是一個對象的實現體。
區別
最本質的一個區別就是默認的訪問控制。默認的繼承訪問權限。struct 是 public 的,class 是 private 的。
struct 作為數據結構的實現體,它默認的數據訪問控制是 public 的,而 class 作為對象的實現體,它默認的成員變量訪問控制是 private 的。
union 聯合
聯合(union)是一種節省空間的特殊的類,一個 union 可以有多個數據成員,但是在任意時刻只有一個數據成員可以有值。當某個成員被賦值后其他成員變為未定義狀態。聯合有如下特點:
? ? ? 默認訪問控制符為 public
? ? ? 可以含有構造函數、析構函數
? ? ?不能含有引用類型的成員
? ? ?不能繼承自其他類,不能作為基類
? ? ?不能含有虛函數
? ? ?匿名 union 在定義所在作用域可直接訪問 union 成員
? ? ?匿名 union 不能包含 protected 成員或 private 成員
? ? ?全局匿名聯合必須是靜態(static)的
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C 常见的面试知识点(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美团智能pos机费率多高?
- 下一篇: c语言排序方法有哪几种?