一、語言基礎與內存管理
-
const
與constexpr
的區別?應用場景?const
:運行時常量,修飾變量/函數不可修改。constexpr
:編譯期常量(C++11),用于優化計算(如數組大小)。
constexpr int size = 10; // 編譯期確定 const int x = get_value(); // 運行時確定
-
指針與引用的本質區別?
- 指針:獨立變量存儲地址,可重指向、可為
nullptr
。 - 引用:別名,綁定后不可變,無空引用,更安全。
- 指針:獨立變量存儲地址,可重指向、可為
-
智能指針(
unique_ptr
/shared_ptr
/weak_ptr
)的實現原理與使用場景?unique_ptr
:獨占所有權,零開銷(替代auto_ptr
)。shared_ptr
:引用計數(原子操作),循環引用需weak_ptr
解決。- ★ 阿里高頻:手寫
shared_ptr
引用計數實現。
-
移動語義(Move Semantics)與完美轉發(Perfect Forwarding)的作用?
std::move
:將左值轉為右值,觸發移動構造(避免深拷貝)。std::forward
:保持參數原始值類型(左值/右值),用于泛型編程。
-
volatile
與atomic
的區別?volatile
:阻止編譯器優化(不保證多線程原子性)。atomic
:硬件級原子操作(如load
/store
),線程安全。
二、面向對象與多態
-
虛函數表(vtable)與虛指針(vptr)的工作原理?
- 每個含虛函數的類有一個vtable,對象通過vptr訪問,運行時動態綁定。
-
為何基類析構函數需聲明為
virtual
?- 避免派生類對象通過基類指針刪除時資源泄漏(未調用派生類析構)。
-
純虛函數與抽象類的聯系?
- 純虛函數(
=0
)使類成為抽象類,強制派生類實現接口。
- 純虛函數(
-
多重繼承下的菱形繼承問題如何解決?
- 虛繼承(
virtual
關鍵字),確保公共基類僅存一份實例。
class D : public B, virtual public C { ... }; // 虛繼承C
- 虛繼承(
三、STL與模板編程
-
vector
底層實現與擴容策略?- 動態數組,2倍擴容(避免頻繁分配),
reserve()
預分配空間優化。
- 動態數組,2倍擴容(避免頻繁分配),
-
map
(紅黑樹)與unordered_map
(哈希表)的性能對比?操作 map
unordered_map
插入/刪除 O(log n) O(1) 平均 有序性 是 否 -
☆ C++17的
std::optional
/std::variant
應用場景?optional
:安全處理可能缺失的值(替代nullptr
或非法值)。variant
:類型安全的聯合體(替代union
),編譯期類型檢查。
std::optional<int> find(int id); // 返回有效值或std::nullopt
-
模板元編程(TMP)的應用案例?
- 編譯期計算(如斐波那契數列)、類型萃取(
type_traits
)。
- 編譯期計算(如斐波那契數列)、類型萃取(
四、并發與多線程
-
std::thread
vsstd::async
?thread
:直接創建線程,需手動管理。async
:可能復用線程池,通過future
自動管理結果。
-
死鎖條件與解決方法?
- 條件:互斥、請求保持、不可剝奪、環路等待。
- 解決:按固定順序加鎖、
std::lock()
原子加鎖、超時機制。
-
無鎖編程的
memory_order
選項(如relaxed
/seq_cst
)?relaxed
:允許亂序(性能高,無同步)。seq_cst
:全局順序一致(默認,性能低)。
-
☆ 協程(Coroutines)的原理與優勢(C++20)?
- 用戶態線程,切換成本低(20~50ns vs 線程1~10μs),支持異步I/O。
- 字節跳動真題:實現百萬級協程調度器(Work-Stealing + 無鎖隊列)。
五、系統設計與性能優化
-
零拷貝(Zero-Copy)技術實現方案?
sendfile()
(Linux):文件→Socket直傳(內核2.2+)。splice()
+pipe
:跨文件描述符傳輸(無用戶態拷貝)。
-
高并發日志系統設計要點?
- 無鎖分片隊列 + 獨立壓縮線程 + Kafka順序寫(美團真題:500萬條/秒)。
-
分布式緩存一致性協議(如Raft)?
- Leader選舉 + 日志復制(多數派確認),腦裂防護(Lease機制)。
- 阿里真題:Redis集群腦裂解決方案。
六、現代C++新特性(C++17/20)
-
☆ 結構化綁定(Structured Binding) :
auto [id, name] = std::make_pair(1, "Alice"); // 解包pair/tuple
-
☆ 概念(Concepts)的作用(C++20)? :
- 約束模板參數,替代SFINAE,提升可讀性。
template <typename T> requires integral<T> // 限定T為整型 T add(T a, T b) { return a + b; }
-
☆ Range庫(C++20)的優勢? :
- 管道式操作:
data | views::filter(...) | views::transform(...)
。
- 管道式操作: