C++ Interview
1. Program、Process 和 Thread 的差別 ?
- Program - 程式設計師所設計的 Code,尚未 Load 到記憶體中,且可以有多個相 同 Program 的 Process 同時存在 。
- Process - 開始執行且 Load 記憶體中的 Program ,在工作管理員中看見的 PID 其實就是 Program 被活化成各個 Process;每一行程式碼隨時都有可能被CPU執行。
- Process 可分為 :
- Independent Process - 每一個 Process 是獨立運作的
- Cooperating Process - 會和別人共同合作的
- I/O bounded process - 等待鍵盤輸入或螢幕輸出
- CPU bounded process - CPU 吃重,計算圓周率、解壓縮等
- Process 不是基本單位,而是 Thread (執行續) 的容器
- Process 需要一些資源才能完成工作,如 CPU 、記憶體、檔案、I/O 等等
- Process 運行量總量不會少於 CPU 的總量
- Thread - 同一個 Process 中可以擁有多個 Thread ,每一個 Thread 負責某一項功能。
- 同一個 Process 會存在多個 Thread
- 同一個 Process 底下的 Thread 資源共享,如記憶體、變數等;不同 Process 則否
- 在多執行續系統中,若兩個 Thread 同時存取或改變同一個全域變數,可能會發生同步問題;若互搶資源則會發生 Deadlock
2. Process 之間可不可以共用記憶體 ?
- 需透過 IPC ( interprocess communication )
- Shared Memory - 共享一塊記憶體
- Message Passing - 透過 Send() 、Receive() 來傳遞和接收資料
3. 下列函數中的各個參數與區域變數,分別存在哪些記憶體區塊 ?
- Stack - 存放函數參數變數、區域變數等,由空間配置系統自行產生與回收;LIFO。
- Heap - 一般 Programmer 分配釋放,執行時才會知道配置大小,如 malloc/new 和 free/delete。(注意其資料結構不是 DS 中的 heap 而是 link-list)
- Global - 包含 BSS、Data Section、Text/Code
- BSS - 未初始化的靜態變數
- Data Section - 全域變數、靜態變數
- Text/Code - 常數字元
int a = 0; // Global 初始化區
char* p1; // Global 未初始化區
static int num_a; //專屬於整個檔案的全域變數,其他檔案不能存取
void GetMessage(char* string) //Stack
{
int sum = 0; //Stack
char* substring ="12346"; //substring 在 Stack區,12346\0 在常量區
static num = 0; // global (static) 初始化區;scope 不變,只能在函數 func 內呼叫,但 lifetime 是整支程式執行的時間。
Dog* puppy = new Dog(); // new Dog 的記憶體區塊在 Heap, puppy 在 Stack
}
※變數範圍和生命周期(關鍵字 static)
- Static- static 變數生命周期 (life time) 跟程式一樣長,而範圍 (scope) 則維持不變,即在宣告的函式之外仍無法存取 static 變數。
- Global - 所有區段皆可使用此變數;可加上 extern 關鍵字修飾,即可在其他檔案以 .h 標頭檔方式使用該變數 (也就是 internal linkage 和 external linkage 的不同)。
4. Merge Sort 、Quick Sort 的原理和時間複雜度
- Merge Sort
- 採用 divide & conquer 演算法 (分而治之)
- 先將整個數列拆半,反覆此動作直至無法拆分為止,在進行排序合併
- O(nlogn)
- Quick Sort
- 採用 divide & conquer 演算法 (分而治之)
- 從數列中挑選一個數字作為 Pivot ,並調整 Pivot 左邊的數字皆比 Pivot 小;
- Best - O(nlogn)
- Worst - O(n^2)
- 當 Pivot 是數列中最大或最小值時發生
5. C++ 的 delete 與 C 的 free 有何差異 ?
- C++
- new - 其底層也是通過 mallow 實現
- operator new (標準函式庫),分配記憶體起始位置
- 呼叫建構子,進行初始化
- 返回新配並建構好的物件指標
- delete
- 呼叫解構子
- operator delete (標準函式庫),釋放記憶體位置
- 差異
- mallow / free 只能動態申請和釋放記憶體,無法強制要求執行建構子和解構子
6. Abstract Class 與 Interface 差異
- Abstract Class
- 可宣告各種方法
- 可撰寫預設方法
- 單一繼承
- Interface
- 只宣告方法
- 可多重繼承
7. 如何限制 new ?
8. 抽象類別與一般類別的差異 ?
抽象類別無法被 new 。
0 意見