2016 年騰訊廣州 C++ 後台技術一面實錄,涵蓋手寫代碼、C++ 語言細節、作業系統原理、網路協議、高併發架構設計等核心考點,附標準答案與解析。
int binarySearch(int* arr, int len, int val) {
int low=0, high=len-1, mid;
while (low <= high) {
mid = (low+high)/2;
if (arr[mid]==val) return mid;
if (val > arr[mid]) low = mid+1;
else high = mid-1;
}
return -1;
}
錯誤方向:堆排序 O(n log n)、冒泡兩輪 O(2n)。
正確 O(n) 單掃描:
int getSecondMax(int* arr, int len) {
if (len <= 1) return -1;
int max = arr[0] > arr[1] ? arr[0] : arr[1];
int second = arr[0] > arr[1] ? arr[1] : arr[0];
for (int i=2; i<len; i++) {
if (arr[i] <= second) continue;
if (arr[i] < max) second = arr[i];
else { second = max; max = arr[i]; }
}
return second;
}
struct 默認 public,class 默認 private。struct 保留 C 相容性,無建構子時可 {} 初始化;class 有建構子則不可。template <class T> 或 typename T,不可用 struct。虛函數表 (vtable) + 虛函數指標 (vptr)。編譯期為每個含虛函數的類別建構 vtable,物件實例化時置入 vptr 指向 vtable。呼叫虛函數時透過 vptr 索引 vtable 定位函數地址實現動態綁定。
指示 C++ 編譯器對該函數採用 C 語言連結規範 (不修飾名稱),使 C++ 可呼叫 C 函式庫,或 C 可呼叫 C++ 函數。解決 C++ 名稱修飾 (Name Mangling) 導致連結失敗。
低址 → 高址:代碼區 → 全域/靜態區 → 堆區 (向上增長) → ... → 棧區 (向下增長) → 保留區。堆棧相向增長,中間為自由區。
wait/waitpid 回收,殘留進程表項目。wait/waitpid;(2) 捕獲 SIGCHLD 信號處理;(3) signal(SIGCHLD, SIG_IGN) 忽略,交由 init 回收;(4) 雙重 fork,孫進程由 init 收養。#define ARRAY_LEN(arr) (sizeof(arr)/sizeof((arr)[0]))
sort -u file # 方法一
sort file | uniq # 方法二
sort file | awk '{if($0!=line)print; line=$0}' # 方法三
sort file | sed '$!N; /^\(.*\)\n\1$/!P; D' # 方法四
| 特性 | select | epoll |
|---|---|---|
| 觸發模式 | 水平觸發 (LT) | LT + 邊緣觸發 (ET) |
| 最大監聽 fd | 1024 (FD_SETSIZE) | 無上限 (受限於記憶體/ulimit) |
| 效能隨 fd 增長 | 線性下降 (輪詢) | O(1) 就緒隊列 |
| 核心/用戶空間拷貝 | 每次拷貝 | mmap 共享記憶體 |
SELECT TOP 3 Age, cnt FROM (
SELECT Age, COUNT(*) AS cnt FROM table1 GROUP BY Age
) t ORDER BY cnt DESC;
應用層 → 傳輸層 → 網路層 → 資料鏈路層 → 物理層。
表達學習意願,結合業務場景 (用戶畫像、推薦、異常檢測) 談理解。