C++

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 小;
                              右邊的數字皆比 Pivot 大,以此反覆直至分不出新數列為止
    • Best - O(nlogn)
    • Worst - O(n^2)
      • 當 Pivot 是數列中最大或最小值時發生

5. C++ 的 delete 與 C 的 free 有何差異 ?

  • C++
    • new - 其底層也是通過 mallow 實現
      1. operator new (標準函式庫),分配記憶體起始位置
      2. 呼叫建構子,進行初始化
      3. 返回新配並建構好的物件指標
    • delete
      1. 呼叫解構子
      2. operator delete (標準函式庫),釋放記憶體位置
  • 差異
    • mallow / free 只能動態申請和釋放記憶體,無法強制要求執行建構子和解構子

6. Abstract Class 與 Interface 差異

  • Abstract Class
    1. 可宣告各種方法
    2. 可撰寫預設方法
    3. 單一繼承 
  • Interface
    1. 只宣告方法
    2. 可多重繼承

7. 如何限制 new ?

     將 operator new 設為 private 。


8. 抽象類別與一般類別的差異 ?

     抽象類別無法被 new 。

  • Share:

You Might Also Like

0 意見