C++進階知識復習 1~15

C++ 進階總復習 (1~15)

    • 目的
      • 1. 介紹下程序從編寫到可執行的整個過程
      • 2. C++中的auto和decltype的區別
      • 3. 介紹下多態的實現原理
      • 4. C++中的new[] 和delete[] 為什么一定要配對使用?
      • 5. C++中malloc申請的內存 可以使用delete釋放嘛
      • 6. 什么情況下會出現內存泄漏
      • 7. C++ String內部是使用堆內存還是棧內存
      • 8. 平時開發C++程序的時候錯誤碼使用的多還是異常使用的多
      • 9. C++中如何進行性能優化
      • 10. 模板的實現一定要放在頭文件中嘛?
      • 11. 什么場景下使用繼承 什么場景下使用組合
      • 12. 什么情況下會出現死鎖 如何避免
      • 13. 如何實現線程池 給出大致思路
      • 14. C++針對返回值進行的優化
      • 15. C++中動靜態庫的區別

目的

寫這一系列文章的目的主要是為了秋招時候應對計算機基礎問題能夠流暢的回答出來 (如果不整理下 磕磕絆絆的回答會被認為是不熟悉)

本文章題目的主要來源來自于 面試鴨
部分面試鴨上沒有而牛客網上有的博主會進行查缺補漏

題目編號按照面試鴨官網題號方便大家尋找

題解大部分是博主根據自己之前的博客再加上部分網上的內容進行口語化的表述 如果涉及到省略的部分博主會提供自己或者其他人的博客鏈接

1. 介紹下程序從編寫到可執行的整個過程

參考博客

預處理相關知識


程序從編寫到可執行分為下面幾個過程

預處理 編譯 匯編 鏈接

首先是預處理階段 在這個階段的時候程序會展開頭文件 宏替換 去注釋等操作

到了編譯階段 這個階段最大的作用就是進行語法詞法分析 并對程序進行優化 看看有沒有什么錯誤的代碼 之后轉化為匯編語言

匯編階段則是將匯編語言轉化為二進制語言

鏈接階段則會生成一個可執行程序 它會合并段表 符號表合并和重定位

2. C++中的auto和decltype的區別


auto關鍵字用于自動推導變量的類型

而decltype關鍵字用于推導表達式的類型 它會返回表達式對應的類型信息而不進行計算

decltype關鍵字在模板編程的時候十分好用


3. 介紹下多態的實現原理

參考博客

多態原理


這里多態主要包括兩點 一個是靜態多態 一個是動態多態

靜態多態的話 它的原理就是函數重載嘛 我們都知道在C語言鏈接階段的時候是通過函數名來標記一個函數的(參數不論) 但是C++的話 參數的個數 順序 類型都會影響函數標記 所以說這就是它的底層原理

然后動態多態的話就是通過虛指針和虛表來實現的嘛

如果說我們的類中有一個虛函數 那么實例化對象的時候 這個對象的大小就會多出四個字節 實際上就是多出一個指針的大小 這個指針就是虛指針

然后這個指針會指向一張表 我們把這張表叫做虛表每個類的虛表都不同 所以說自然會產生不同的函數效果

4. C++中的new[] 和delete[] 為什么一定要配對使用?


因為如果不這樣做可能會造成內存泄漏的情況

我們一般來說是建議new[] 和 delete[] 配對使用的 但是說也有特殊情況

比如說如果我們new []了內置類型的話 我們使用delete刪除就不會造成內存泄漏的情況

如果是自定義類型的話 就會造成這種情況


為什么自定義類型會造成而內置類型不會造成呢? 這里可以推斷一下 可能是因為內置類型重載了opeartor new 和opeartor delete

5. C++中malloc申請的內存 可以使用delete釋放嘛


不可以 malloc申請的內容應該使用free釋放

雖然說delete底層是調用free函數 但是delete還做了更多的事情

它首先會調用析構函數 之后才會釋放內存

如果說直接使用delete的話很可能會出現未定義行為 甚至報錯

6. 什么情況下會出現內存泄漏

參考博客

內存泄漏


其實很多情況下都會出現內存泄漏

比如說指針原本指向一塊分配好的內存 但是指針丟失了

比如說循環引用

比如說創建對象之后沒有釋放

那么如何解決呢?

當然也有很多種方法解決

我們可以使用內存泄漏檢測工具 valgrind

然后使用RAII思想去檢測

有一個良好的代碼編程習慣等等

7. C++ String內部是使用堆內存還是棧內存

參考博客

string的模擬實現


模擬實現過string之后就會知道 string的底層其實維護了一個指針 這個指向會指向堆上開辟的空間

所以說string內部使用的是堆內存

8. 平時開發C++程序的時候錯誤碼使用的多還是異常使用的多


錯誤碼使用的比較多

因為錯誤碼相對于異常來說

  1. 性能開銷更小
  2. 更適合處理復雜的流程 能夠只管的反應錯誤信息

但是錯誤碼也有缺點

就是我們寫需求的時候 每次寫新的需求 大概率就要寫新的錯誤碼 就會造成代碼臃腫 如果不注釋 就很難知道錯誤碼表示什么信息 可能出現意料之外的錯誤

9. C++中如何進行性能優化


這個可以從很多點上去回答

從代碼編寫的角度來說

  1. 選取合適的數據結構 比如說在頻繁查詢的場景下使用哈希表來存儲數據
  2. 選擇合適的算法 優化算法的時空復雜度
  3. 使用RAII思想 使用對象管理資源 避免資源泄漏

從架構層面上來說

根據需求來設計合適的架構 比如redis和mysql的冷熱數據分離

10. 模板的實現一定要放在頭文件中嘛?

參考博客

模板的編譯分離


我們一般來說是簡歷將模板和生命和定義放在一起的

但是也不是沒有辦法比如說我們可以顯示的實例化

這樣子鏈接的時候就不會報錯了

11. 什么場景下使用繼承 什么場景下使用組合


我們在is a的關系下使用繼承

在has a的關系下使用組合

就比如說人類和學生的關系 學生是人類 所以說這個時候我們推薦使用繼承

比如說輪胎和汽車的關系 輪胎是汽車的一部分 所以說這個時候我們推薦使用組合

12. 什么情況下會出現死鎖 如何避免

參考博客


多線程


這里其實是考察死鎖的四個必要條件

  1. 互斥 一個資源每次只能被一個執行流使用
  2. 請求與保持 一個執行流因請求資源而阻塞時 對已獲得的資源保持不放
  3. 不剝奪 一個執行流已獲得的資源 在未使用完之前 不能強行剝奪
  4. 循環等待 若干執行流之間形成一種頭尾相接的循環等待資源的關系

至于如何避免死鎖就很簡單了 我們只需要破壞死鎖的四個必要條件即可

13. 如何實現線程池 給出大致思路

這里具體參考我的這篇博客

線程池

這個問題是個很宏大的問題 能夠引出很多小問題 可以把上面那篇博客吃透之后再去回答

14. C++針對返回值進行的優化


在返回一個臨時對象的時候 如果按照一般的方式 可能要經歷

析構函數 拷貝構造

而C++優化可能會直接在返回值位置構建一個對象 這就是C++針對返回值的優化

15. C++中動靜態庫的區別

參考博客

動態庫和靜態庫


動靜態庫的本質其實都是半成品程序 也就是說.o文件 也可以說是二進制文件嘛

靜態庫的話其實就是在程序鏈接的時候將這個.o文件打包到程序里面嘛

動態庫的話是程序運行的時候將動態庫加載到共享區去

他們之前的區別主要是 靜態庫打包到程序里面 它就不需要依賴外部文件了嘛 但是有利有弊就會造成程序的膨脹

動態庫就是相反嘛 節省磁盤空間 減少冗余代碼 但是說如果缺少了庫文件就無法運行

打個比方的話就是 將庫文件比作電腦嘛

靜態庫就是電腦放在宿舍里面 隨時都能玩 但是占用空間

動態庫就是電腦放在網吧 想玩要去網吧玩 但是占用空間小

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74207.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

輸電線路航空標志球:低空飛行的安全路標 / 恒峰智慧科技

在現代社會,隨著航空業的快速發展,低空飛行活動日益頻繁。為了確保飛行安全,避免飛機與高壓電線等障礙物發生碰撞,輸電線路航空標志球應運而生。這種裝置被廣泛應用于高壓輸電線路上,尤其是超高壓和跨江輸電線&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件詳解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件詳解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件詳解 在 Debian/Ubuntu 系統中,/etc/network/interfaces 是傳統網絡接口配置文件,用于定義網絡接口的靜態/動態配置。以下是逐項解…

OpenCV 圖形API(或稱G-API)(1)

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 引言 OpenCV 圖形API(或稱G-API)是一個新的OpenCV模塊,旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路2. 代碼實現 題目鏈接:3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路 這一題大的思路上不難想到就是一個動態規劃的思路。我們分別…

win10之mysql server 8.0.41安裝

一 mysql server 下載 官網下載地址頁面 https://dev.mysql.com/downloads/mysql/二 免裝版使用步驟 1 解壓 下載完成后,解壓文件夾,如下所示: 2 執行安裝命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二屆藍橋杯省賽軟件類(cc++組)

第一題&#xff08;空間&#xff09; 解題思路 答案 #include <stdio.h>int main() {// 計算256MB對應的字節數&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每個32位二進制整數占4個字節&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移動語義

文章目錄 一、移動語義1、為什么需要移動語義&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何實現移動語義&#xff1f;——移動構造函數/賦值4、什么時候觸發移動&#xff1f;5、移動 vs 拷貝 一、移動語義 1、為什么需要移動語…

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA節點探測是干什么用的?

想象一個大城市被劃分成幾個區&#xff08;比如東區、西區&#xff09;。每個區有自己的超市&#xff08;內存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本區的超市買東西最快&#xff0c;去其他區的超市會慢一些。 NUMA節點探測&#xff0c;就是Linux系統在…

使用 Less 實現 PC 和移動端樣式適配

&#x1f310; 使用 Less 實現 PC 和移動端樣式適配 —— 以 position 屬性為例 在前端開發中&#xff0c;我們常常會遇到這樣一個場景&#xff1a; 在 PC 頁面中需要某個元素是 position: relative;&#xff0c;但在移動端卻希望它是 position: inherit;&#xff0c;以便更靈…

企業戰略管理(設計與工程師類)-2-戰略規劃及管理過程-1-概述

戰略管理過程 參考資料&#xff1a; 戰略管理 - 清華大學- 蔡臨寧公司戰略與風險管理 - 華中科技大學 - 賀遠瓊戰略管理 - 北京理工大學 - 楊萬榮DeepSeek - 深度思考與聯網檢索 AFI框架 戰略管理最典型的就是采用傳統的AFI通用戰略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并發原理以及技術實現對比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架雖然都支持高并發&#xff0c;但它們的實現原理、底層機制和適用場景有顯著差異。以下從 高并發原理、技術實現區別、優缺點 三個方面詳細分析&#xff1a; 一、高并發實現原理 1. Hyperf (PHP Swoole) Hyperf 的高并發能力基于 Swoo…

【教程】如何利用bbbrisk一步一步實現評分卡

利用bbbrisk一步一步實現評分卡 一、什么是評分卡1.1.什么是評分卡1.2.評分卡有哪些 二、評分卡怎么弄出來的2.1.如何制作評分卡2.2.制作評分卡的流程 三、變量的分箱3.1.數據介紹3.2.變量自動分箱3.3.變量的篩選 四、構建評分卡4.1.評分卡實現代碼4.2.評分卡表4.3.閾值表與分數…

AI日報 - 2025年4月2日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | 研究揭示零RL訓練可誘發模型頓悟&#xff0c;Anthropic發布Claude 3.5內部機制研究&#xff0c;簡化語言模型推理優化新方法提出。 DeepSeek-R1無需額外指令即可深度推理&#xff1b;Anthro…

探索 Kubernetes 網絡穿透:如何從外部訪問 K8s Pod 地址

文章目錄 探索 Kubernetes 網絡穿透&#xff1a;如何從外部訪問 K8s Pod 地址為什么需要外部訪問 Pod 地址&#xff1f;常見的網絡穿透方案NodePortLoadBalancerIngressPort-ForwardHostNetworkkt-connect&#xff1a;為開發調試提供便捷穿透 實踐建議與注意事項各方案對比表總…

深入理解 Apache Dagster:數據管道編排實戰指南

本文系統介紹了 Apache Dagster 的核心概念與實踐方法&#xff0c;涵蓋環境搭建、管道定義、運行調試及高級功能&#xff0c;幫助開發者快速掌握這一現代化數據編排工具&#xff0c;提升數據工程效率。 1. 背景與核心優勢 隨著數據驅動應用的復雜化&#xff0c;傳統工具在可維…

Minio集群部署

Minio集群部署 資源規劃 IP服務規劃配置192.168.116.138minio-116核32G磁盤10T192.168.116.139minio-216核32G磁盤10T192.168.116.140minio-316核32G磁盤10T192.168.116.141minio-416核32G磁盤10T192.168.116.128nginx代理8核16G磁盤500G 基本環境配置 下面命令minio4臺設備…

操作系統高頻(六)linux內核

操作系統高頻&#xff08;六&#xff09;linux內核 1.內核態&#xff0c;用戶態的區別??? 內核態和用戶態的區別主要在于權限和安全性。 權限&#xff1a;內核態擁有最高的權限&#xff0c;可以訪問和執行所有的系統指令和資源&#xff0c;而用戶態的權限相對較低&#x…

強大而易用的JSON在線處理工具

強大而易用的JSON在線處理工具&#xff1a;程序員的得力助手 在當今的軟件開發世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已經成為了數據交換的通用語言。無論是前端還是后端開發&#xff0c;我們都經常需要處理、驗證和轉換JSON數據。今天&a…