電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 76|回復(fù): 0
收起左側(cè)

金山C++一面,強(qiáng)度拉滿!配答案,建議收藏。

[復(fù)制鏈接]

277

主題

277

帖子

2400

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2400
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-10 19:59:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1. C++程序的內(nèi)存分布
C++程序的內(nèi)存通常分為以下幾個(gè)部分:
棧(Stack):用于存儲(chǔ)局部變量和函數(shù)調(diào)用的信息。棧上的內(nèi)存是自動(dòng)管理的,函數(shù)調(diào)用結(jié)束后自動(dòng)釋放。
堆(Heap):用于動(dòng)態(tài)分配內(nèi)存,通過(guò) new 和 delete 進(jìn)行管理。堆上的內(nèi)存需要手動(dòng)管理。
全局/靜態(tài)區(qū)(Global/Static Area):用于存儲(chǔ)全局變量和靜態(tài)變量。這些變量在整個(gè)程序運(yùn)行期間都存在。
代碼區(qū)(Code Section):用于存儲(chǔ)程序的機(jī)器碼。
詳細(xì)解答可以閱讀:面試題:C++ 內(nèi)存四區(qū)
2. 堆和棧的區(qū)別
分配方式:棧上的內(nèi)存是自動(dòng)分配和釋放的,而堆上的內(nèi)存需要手動(dòng)管理。
生命周期:棧上的變量在函數(shù)調(diào)用結(jié)束后自動(dòng)銷毀,堆上的變量需要顯式釋放。
訪問(wèn)速度:棧上的訪問(wèn)速度快,因?yàn)闂J沁B續(xù)的內(nèi)存區(qū)域;堆上的訪問(wèn)速度相對(duì)較慢。
大小限制:棧的大小通常有限制(如幾 MB),而堆的大小可以更大。
3. 內(nèi)存泄漏怎么辦
使用智能指針:如 std::unique_ptr 和 std::shared_ptr,它們會(huì)自動(dòng)管理內(nèi)存。
代碼審查:定期檢查代碼,確保每個(gè) new 都有一個(gè)對(duì)應(yīng)的 delete。
內(nèi)存檢測(cè)工具:使用工具如 Valgrind、Visual Studio 的內(nèi)存檢測(cè)工具等,幫助發(fā)現(xiàn)內(nèi)存泄漏。
RAII(Resource Acquisition Is Initialization):使用 RAII 技術(shù),確保資源在對(duì)象銷毀時(shí)自動(dòng)釋放。
4. 智能指針有哪幾種
std::unique_ptr:獨(dú)占所有權(quán)的智能指針,不允許復(fù)制。
std::shared_ptr:共享所有權(quán)的智能指針,允許多個(gè)指針共享同一個(gè)對(duì)象。
std::weak_ptr:弱引用智能指針,用于解決 std::shared_ptr 的循環(huán)引用問(wèn)題。
5. 循環(huán)引用計(jì)數(shù)最后是多少
在循環(huán)引用的情況下,std::shared_ptr 的引用計(jì)數(shù)不會(huì)自動(dòng)減為零,導(dǎo)致內(nèi)存泄漏。通常需要使用 std::weak_ptr 來(lái)打破循環(huán)引用。
6. shared_ptr線程安全嗎
引用計(jì)數(shù)操作是線程安全的:多個(gè)線程可以安全地對(duì)同一個(gè) std::shared_ptr 進(jìn)行引用計(jì)數(shù)操作。
對(duì)象訪問(wèn)不是線程安全的:對(duì) std::shared_ptr 所指向的對(duì)象的訪問(wèn)需要額外的同步機(jī)制(如 std::mutex)來(lái)保證線程安全。
7. 多線程使用shared_ptr如何保護(hù)數(shù)據(jù)安全
使用互斥鎖:在多線程環(huán)境中,使用 std::mutex 或 std::lock_guard 來(lái)同步對(duì) std::shared_ptr 所指向的對(duì)象的訪問(wèn)。
使用 std::atomic>:如果需要更細(xì)粒度的控制,可以使用 std::atomic>。
8. 條件變量偽喚醒
條件變量的偽喚醒是指條件變量在沒(méi)有實(shí)際通知的情況下被喚醒。為了避免偽喚醒,通常需要在循環(huán)中檢查條件變量的狀態(tài)。
  • std::unique_lockstd::mutex> lock(mtx);
    while (!condition) {    cv.wait(lock);}
    9. unique_ptr轉(zhuǎn)移所有權(quán)

    使用 std::move 將 std::unique_ptr 的所有權(quán)轉(zhuǎn)移給另一個(gè) std::unique_ptr。
  • std::unique_ptrint> ptr1 = std::make_uniqueint>(42);
    std::unique_ptrint> ptr2 = std::move(ptr1);  // 轉(zhuǎn)移所有權(quán)
    10. move實(shí)現(xiàn)方式

    std::move 實(shí)際上是一個(gè)類型轉(zhuǎn)換函數(shù),將左值轉(zhuǎn)換為右值引用,以便調(diào)用移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符。
  • template typename T>
    typename std::remove_reference::type&& move(T&& arg) {
        return static_casttypename std::remove_reference::type&&>(arg);
    }
    11. 完美轉(zhuǎn)發(fā)有什么用

    完美轉(zhuǎn)發(fā)用于在模板函數(shù)中保持參數(shù)的原始類型和屬性,避免不必要的拷貝和類型轉(zhuǎn)換。
  • template typename T, typename... Args>
    void forward_example(T&& t, Args&&... args) {
        function(std::forward(t), std::forward(args)...);
    }
    12. 模板的特化和偏特化
    全特化:為特定類型的模板參數(shù)提供專門的實(shí)現(xiàn)。
    偏特化:為部分類型的模板參數(shù)提供專門的實(shí)現(xiàn)。
  • template typename T>struct MyTemplate {    void func() { /* 通用實(shí)現(xiàn) */ }};
    // 全特化template struct MyTemplate {    void func() { /* 特化實(shí)現(xiàn) */ }};// 偏特化template typename T>struct MyTemplate {    void func() { /* 偏特化實(shí)現(xiàn) */ }};
    13. C++和C申請(qǐng)內(nèi)存方式的區(qū)別

    C++:使用 new 和 delete。
    C:使用 malloc、calloc、realloc 和 free。
    更詳細(xì)的閱讀:百度實(shí)習(xí)面試:new和malloc的區(qū)別,什么時(shí)候用new  什么時(shí)候用mallc?
    面試題:new出來(lái)的對(duì)象可以使用bzero等函數(shù)初始化內(nèi)部變量為0嗎?——信銳技術(shù)一面
    14. C++釋放數(shù)組和普通對(duì)象的區(qū)別
    普通對(duì)象:使用 delete。
    數(shù)組:使用 delete[]。
  • int* ptr1 = new int;delete ptr1;
    int* ptr2 = new int[10];delete[] ptr2;
    15. 動(dòng)態(tài)多態(tài)虛表的位置在哪

    虛表本身通常存儲(chǔ)在程序的只讀數(shù)據(jù)段(或代碼段)中,因?yàn)樘摫淼膬?nèi)容在程序運(yùn)行時(shí)是固定的,不會(huì)被修改。每個(gè)類的虛表在程序的編譯階段生成,并在程序加載時(shí)分配內(nèi)存。
    16. 有序數(shù)組去重不用額外空間
    使用雙指針?lè)?br /> 17. 二叉樹度為0和度為2的數(shù)量關(guān)系
    對(duì)于一棵二叉樹,設(shè)度為0的節(jié)點(diǎn)數(shù)為 n0,度為2的節(jié)點(diǎn)數(shù)為 n2,則有:[ n0 = n2 + 1 ]
    18. 哈夫曼樹構(gòu)建過(guò)程
    1. 統(tǒng)計(jì)頻率:統(tǒng)計(jì)每個(gè)字符出現(xiàn)的頻率。
    2. 創(chuàng)建節(jié)點(diǎn):為每個(gè)字符創(chuàng)建一個(gè)節(jié)點(diǎn),頻率作為節(jié)點(diǎn)的權(quán)重。
    3. 創(chuàng)建優(yōu)先隊(duì)列:將所有節(jié)點(diǎn)加入優(yōu)先隊(duì)列。
    4. 構(gòu)建哈夫曼樹:
       從優(yōu)先隊(duì)列中取出兩個(gè)最小權(quán)重的節(jié)點(diǎn)。
       創(chuàng)建一個(gè)新的內(nèi)部節(jié)點(diǎn),權(quán)重為這兩個(gè)節(jié)點(diǎn)的權(quán)重之和。
       將這兩個(gè)節(jié)點(diǎn)作為新節(jié)點(diǎn)的左右子節(jié)點(diǎn)。
       將新節(jié)點(diǎn)加入優(yōu)先隊(duì)列。
       重復(fù)上述步驟,直到優(yōu)先隊(duì)列中只剩下一個(gè)節(jié)點(diǎn),即為哈夫曼樹的根節(jié)點(diǎn)。
    19. 快排最壞情況發(fā)生
    快排的最壞情況發(fā)生在每次分區(qū)選擇的樞軸都是最小或最大值時(shí),時(shí)間復(fù)雜度為 O(n^2)。
    20. 遞歸算法對(duì)比循環(huán)的問(wèn)題
    遞歸:代碼簡(jiǎn)潔易懂,但可能會(huì)導(dǎo)致棧溢出,時(shí)間復(fù)雜度較高。
    循環(huán):代碼可能較復(fù)雜,但通常更高效,不會(huì)導(dǎo)致棧溢出。
    21. 優(yōu)先隊(duì)列的實(shí)現(xiàn)
    優(yōu)先隊(duì)列通常使用二叉堆(最大堆或最小堆)來(lái)實(shí)現(xiàn),支持插入和刪除操作。
    22. 有一個(gè)超大文件,無(wú)法一次性加載到內(nèi)存,如何排序
    可以使用外部排序算法,如歸并排序:
    1. 分塊排序:將文件分成多個(gè)小塊,每個(gè)小塊可以加載到內(nèi)存中并進(jìn)行排序。
    2. 合并排序:將排序后的塊合并成一個(gè)有序的大文件。
    23. B+樹對(duì)比普通樹,紅黑樹的區(qū)別,為什么不用B樹
    B+樹:葉子節(jié)點(diǎn)包含所有關(guān)鍵字,且葉子節(jié)點(diǎn)之間有指針相連,適合磁盤存儲(chǔ)和范圍查詢。
    B樹:每個(gè)節(jié)點(diǎn)可以有多個(gè)關(guān)鍵字,適合磁盤存儲(chǔ),但不支持高效的范圍查詢。
    紅黑樹:自平衡二叉搜索樹,適合內(nèi)存中的快速查找和插入。
    B+樹更適合數(shù)據(jù)庫(kù)和文件系統(tǒng)的索引,因?yàn)樗鼈冎С指咝У姆秶樵兒痛疟P訪問(wèn)。
    24. HTTP 1/2/3版本的區(qū)別
    HTTP/1.1:持久連接、管道化、緩存控制。
    HTTP/2:多路復(fù)用、頭部壓縮、服務(wù)器推送。
    HTTP/3:基于 QUIC 協(xié)議,改進(jìn)了連接建立和數(shù)據(jù)傳輸性能。
    5. HTTP Cookie作用
    Cookie 用于存儲(chǔ)客戶端的狀態(tài)信息,如會(huì)話標(biāo)識(shí)、用戶偏好等。服務(wù)器可以通過(guò)設(shè)置 Cookie 來(lái)跟蹤用戶的會(huì)話。
    26. TCP擁塞控制方法
    慢啟動(dòng):初始時(shí)快速增加擁塞窗口。
    擁塞避免:線性增加擁塞窗口。
    快重傳:接收方收到亂序數(shù)據(jù)包時(shí)發(fā)送重復(fù) ACK。
    快恢復(fù):發(fā)送方接收到三個(gè)重復(fù) ACK 時(shí),將擁塞窗口減半,然后進(jìn)入擁塞避免階段。
    end

    一口Linux

    關(guān)注,回復(fù)【1024】海量Linux資料贈(zèng)送
    精彩文章合集
    文章推薦
    ?【專輯】ARM?【專輯】粉絲問(wèn)答?【專輯】所有原創(chuàng)?【專輯】linux入門?【專輯】計(jì)算機(jī)網(wǎng)絡(luò)?【專輯】Linux驅(qū)動(dòng)?【干貨】嵌入式驅(qū)動(dòng)工程師學(xué)習(xí)路線?【干貨】Linux嵌入式所有知識(shí)點(diǎn)-思維導(dǎo)圖
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表