大家好,我是小林。DzM28資訊網——每日最新資訊28at.com
關注我的同學,有很多都是學C++的同學,針對互聯網后端崗位的話,C++可能沒有太多優勢,因為很少項目是用 C++ 做后端業務類型的開發了,主流的還是 java 和 go 后端。DzM28資訊網——每日最新資訊28at.com
但是,很多互聯網客戶端崗位會喜歡 C++ 同學,因為學 C++的同學,通常計算機基礎都還不錯,很多人可能不太知道客戶端崗位具體會問什么,其實主要也是圍繞 C++、網絡、操作系統、算法,這四大塊問了,像數據庫、消息隊列后端組件這些就不會問了。DzM28資訊網——每日最新資訊28at.com
這次就分享一位 C++同學,面字節客戶端崗位的面經,都是圍繞C++、網絡、操作系統、算法這四大塊內容去問了。DzM28資訊網——每日最新資訊28at.com
C++
C++中的內存分區有哪些?
在C++中,內存主要分為以下五個區域:DzM28資訊網——每日最新資訊28at.com
圖片DzM28資訊網——每日最新資訊28at.com
- 棧區(Stack):由編譯器自動分配釋放,存放函數的參數值,局部變量等。其操作方式類似于數據結構中的棧。
- 堆區(Heap):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。注意,與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
- 全局區(靜態區)(Static):全局變量和靜態變量被分配到同一塊內存中。在C++中,全局區還包含了常量區,字符串常量和其他常量也是存儲在此。
- 常量區:是全局區的一部分,存放常量,不允許修改。
- 代碼區(Text):存放函數體的二進制代碼。
介紹一下內存對齊
內存對齊就是就是將數據存放在內存的某個位置,使得CPU可以更快地訪問到這個數據,以空間換時間的方式來提高 cpu 訪問數據的性能。DzM28資訊網——每日最新資訊28at.com
在C++中,內存對齊主要涉及到兩個概念:對齊邊界和填充字節。DzM28資訊網——每日最新資訊28at.com
- 對齊邊界:一般情況下,編譯器會自動地將數據存放在它的自然邊界上。例如,int類型的數據,它的大小為4字節,編譯器會將其存放在4的倍數的地址上。這就是所謂的對齊邊界。
- 填充字節:為了滿足對齊邊界的要求,編譯器有時候需要在數據之間填充一些字節。這些字節沒有實際的意義,只是為了滿足內存對齊的要求。
為什么要字節對齊?
- 平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
- 性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
vector中push_back和emplace_back的區別?
- push_back() 向容器尾部添加元素時,首先會創建這個元素,然后再將這個元素拷貝或者移動到容器中(如果是拷貝的話,事后會自行銷毀先前創建的這個元素);
- 而emplace_back() 在實現時,則是直接在容器尾部創建這個元素,省去了拷貝或移動元素的過程。
C++中的多態怎么實現的?
C++中的多態主要通過虛函數和繼承來實現。多態分為兩種:編譯時多態和運行時多態。DzM28資訊網——每日最新資訊28at.com
- 編譯時多態:也稱為靜態多態或早綁定。這種多態是通過函數重載和模板來實現的。
- 運行時多態:也稱為動態多態或晚綁定。這種多態是通過虛函數和繼承來實現的。當基類的指針或引用指向派生類對象時,調用的虛函數將是派生類的版本,這就實現了運行時多態。
什么是純虛函數?有哪些應用場景
純虛函數是在基類中聲明的虛函數,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在C++中,純虛函數的聲明形式如下:DzM28資訊網——每日最新資訊28at.com
virtual void function() = 0;
其中,= 0就表示這是一個純虛函數。DzM28資訊網——每日最新資訊28at.com
含有純虛函數的類被稱為抽象類。抽象類不能被實例化,只能作為接口使用。派生類必須實現所有的純虛函數,否則該派生類也會變成抽象類。DzM28資訊網——每日最新資訊28at.com
純虛函數的應用場景主要包括:DzM28資訊網——每日最新資訊28at.com
- 設計模式:例如在模板方法模式中,基類定義一個算法的骨架,而將一些步驟延遲到子類中。這些需要在子類中實現的步驟就可以聲明為純虛函數。
- 接口定義:可以創建一個只包含純虛函數的抽象類作為接口。所有實現該接口的類都必須提供這些函數的實現。
為什么一般將析構函數設置為虛函數?
析構函數被設為虛函數主要是為了解決基類指針指向派生類對象時的資源釋放問題。DzM28資訊網——每日最新資訊28at.com
如果我們有一個基類指針,它實際上指向一個派生類對象,當我們刪除這個基類指針時,如果析構函數不是虛函數,那么就只會調用基類的析構函數,而不會調用派生類的析構函數。這可能會導致派生類對象的一些資源沒有被正確釋放,從而引發內存泄漏等問題。DzM28資訊網——每日最新資訊28at.com
如果我們將析構函數設置為虛函數,那么在刪除基類指針時,會首先調用派生類的析構函數,然后再調用基類的析構函數,從而確保所有的資源都能被正確釋放。DzM28資訊網——每日最新資訊28at.com
什么是內聯函數?
在C++中,使用關鍵字"inline"可以聲明一個內聯函數。聲明為內聯函數的函數會在編譯時被視為候選項,編譯器會嘗試將其展開,將函數體直接插入到調用點處。這樣可以避免函數調用的開銷,減少了函數調用的棧幀等額外開銷,從而提高程序的執行效率。DzM28資訊網——每日最新資訊28at.com
內聯函數有什么缺點?
內聯函數的缺點主要有以下幾點:DzM28資訊網——每日最新資訊28at.com
- 代碼膨脹:內聯函數會在每個調用它的地方進行代碼替換,這可能導致代碼膨脹。如果內聯函數體非常大或者被頻繁調用,會增加可執行文件的大小,可能導致緩存不命中,影響性能。
- 編譯時間增加:內聯函數需要在每個調用點進行代碼替換,這會增加編譯時間。特別是當內聯函數被廣泛使用時,編譯時間可能會顯著增加。
- 可讀性降低:內聯函數會將函數體嵌入到調用點,可能導致代碼的可讀性降低。函數體被分散在多個地方,可能會使代碼難以理解和維護。
網絡
http狀態碼有哪些?
五大類 HTTP 狀態碼DzM28資訊網——每日最新資訊28at.com
圖片DzM28資訊網——每日最新資訊28at.com
- 1xx 類狀態碼屬于提示信息,是協議處理中的一種中間狀態,實際用到的比較少。
- 2xx 類狀態碼表示服務器成功處理了客戶端的請求,也是我們最愿意看到的狀態。
- 3xx 類狀態碼表示客戶端請求的資源發生了變動,需要客戶端用新的 URL 重新發送請求獲取資源,也就是重定向。
- 4xx 類狀態碼表示客戶端發送的報文有誤,服務器無法處理,也就是錯誤碼的含義。
- 5xx 類狀態碼表示客戶端請求報文正確,但是服務器處理時內部發生了錯誤,屬于服務器端的錯誤碼。
http1.1、2.0版本的區別?
HTTP/1.1和HTTP/2.0是兩個不同版本的HTTP協議,它們之間有以下幾個主要區別:DzM28資訊網——每日最新資訊28at.com
- 多路復用:HTTP/1.1中,每個請求都需要建立一個獨立的連接,而HTTP/2.0引入了多路復用技術,允許在同一個連接上同時發送多個請求和接收多個響應,提高了并發性能。
- 二進制分幀:HTTP/2.0使用二進制分幀機制,將請求和響應數據分割為更小的幀,每個幀都有自己的標識和優先級,可以獨立傳輸和處理,提高了數據傳輸的靈活性和效率。
- 首部壓縮:HTTP/2.0使用了首部壓縮算法,減少了請求和響應的首部大小,節省了帶寬和傳輸時間。
- 服務器推送:HTTP/2.0支持服務器推送,服務器可以在客戶端請求之前主動將相關資源推送給客戶端,減少了額外的請求延遲。
在瀏覽器輸入URL之后,具體流程是什么?
具體的流程如下:DzM28資訊網——每日最新資訊28at.com
- URL解析:瀏覽器首先解析輸入的URL,提取出協議、主機名、端口號、路徑等信息。
- DNS解析:瀏覽器將主機名轉換為對應的IP地址,通過DNS解析來完成這一步驟。
- 建立TCP連接:瀏覽器與服務器之間建立TCP連接,通過三次握手建立可靠的連接。
- 發送HTTP請求:瀏覽器構建HTTP請求報文,包括請求方法(GET、POST等)、請求頭部、請求體等信息,并將其發送給服務器。
- 服務器處理請求:服務器接收到請求后,根據請求的路徑、參數等進行處理,并生成對應的HTTP響應。
- 接收HTTP響應:瀏覽器接收到服務器返回的HTTP響應報文,包括響應狀態碼、響應頭部、響應體等信息。
- 渲染頁面:瀏覽器根據接收到的響應數據,解析HTML、CSS、JavaScript等資源,并進行頁面的渲染,展示給用戶。
- 關閉TCP連接:頁面渲染完成后,瀏覽器與服務器之間的TCP連接會被關閉,釋放網絡資源。
tcp 是怎么實現可靠傳輸的?
- 序列號與確認應答:TCP將每個發送的數據包進行編號(序列號),接收方通過發送確認應答(ACK)來告知發送方已成功接收到數據。如果發送方在一定時間內未收到確認應答,會進行超時重傳。
- 數據校驗:TCP使用校驗和來驗證數據的完整性。接收方會計算接收到的數據的校驗和,并與發送方發送的校驗和進行比較,以檢測數據是否在傳輸過程中發生了錯誤。
- 窗口控制:TCP使用滑動窗口機制來控制發送方和接收方之間的數據流量。發送方根據接收方的處理能力和網絡狀況來調整發送的數據量,接收方則通過窗口大小來告知發送方可以接收的數據量。
- 重傳機制:如果發送方未收到確認應答或接收方檢測到數據錯誤,TCP會進行重傳。發送方會根據超時時間或接收方的冗余確認來觸發重傳,以確保數據的可靠傳輸。
- 擁塞控制:TCP使用擁塞控制算法來避免網絡擁塞。通過動態調整發送速率和窗口大小,TCP可以根據網絡的擁塞程度來進行適當的調整,以提高網絡的利用率和穩定性。
IP數據報的報頭有哪些字段?
圖片DzM28資訊網——每日最新資訊28at.com
IP數據報的報頭包含以下字段:DzM28資訊網——每日最新資訊28at.com
- 版本(Version):指定IP協議的版本,通常為IPv4或IPv6。
- 首部長度(Header Length):指定IP報頭的長度,以32位字(4字節)為單位。
- 服務類型(Type of Service):用于指定數據報的服務質量要求,如優先級、延遲、吞吐量等。
- 總長度(Total Length):指定整個IP數據報的長度,包括報頭和數據部分。
- 標識(Identification):用于唯一標識一個IP數據報,通常由發送方設置,接收方用于重組分片。
- 標志(Flags):包含3個標志位,分別是DF(Don't Fragment,不分片)、MF(More Fragments,更多分片)、和保留位。
- 分片偏移(Fragment Offset):用于指示當前分片相對于原始數據報的偏移量,以8字節為單位。
- 生存時間(Time to Live):指定數據報在網絡中可以經過的最大路由器跳數,每經過一個路由器,該值減1,為0時數據報被丟棄。
- 協議(Protocol):指定IP數據報中承載的上層協議,如TCP、UDP、ICMP等。
- 頭部校驗和(Header Checksum):用于檢驗IP報頭的完整性,接收方使用該字段來驗證報頭是否正確。
- 源IP地址(Source IP Address):指定發送方的IP地址。
- 目標IP地址(Destination IP Address):指定接收方的IP地址。
IP 報文的TTL是什么意思?
指定數據報在網絡中可以經過的最大路由器跳數。每當數據報經過一個路由器時,該字段的值會減少1。當TTL的值為0時,路由器將丟棄該數據報并發送ICMP的時間超過消息給源主機。DzM28資訊網——每日最新資訊28at.com
TTL的主要目的是防止數據報在網絡中無限循環,避免由于路由環路或其他問題導致的數據報無法正常到達目的地。通過限制數據報的最大跳數,TTL可以確保數據報在有限的時間內能夠到達目標主機或被丟棄,以避免網絡資源的浪費和延遲。DzM28資訊網——每日最新資訊28at.com
操作系統
虛擬地址是怎么轉化到物理地址的?
圖片DzM28資訊網——每日最新資訊28at.com
虛擬地址到物理地址的轉換是通過操作系統中的內存管理單元(MMU,Memory Management Unit)來完成的。下面是一般的虛擬地址到物理地址轉換過程:DzM28資訊網——每日最新資訊28at.com
- 程序發出內存訪問請求時,使用虛擬地址進行訪問。
- 虛擬地址被傳遞給MMU進行處理。
- MMU中的地址映射表(頁表)被用來將虛擬地址轉換為物理地址。頁表是一種數據結構,用于存儲虛擬地址和物理地址之間的映射關系。
- MMU根據頁表中的映射關系,將虛擬地址轉換為對應的物理地址。
- 轉換后的物理地址被傳遞給內存系統,用于實際的內存訪問操作。
頁表是怎么構成的?
頁表是一種數據結構,用于存儲虛擬地址和物理地址之間的映射關系。多級頁表將頁表分為多個層級,每個層級的頁表項存儲下一級頁表的物理地址。通過多級索引,可以逐級查找,最終找到對應的物理頁。DzM28資訊網——每日最新資訊28at.com
對于 64 位的系統,主要有四級目錄,分別是:DzM28資訊網——每日最新資訊28at.com
- 全局頁目錄項 PGD
- 上層頁目錄項 PUD
- 中間頁目錄項 PMD
- 頁表項 PTE
圖片DzM28資訊網——每日最新資訊28at.com
進程間通信有哪些?
- 管道(Pipe):管道是一種半雙工的通信方式,可以在父子進程或者具有親緣關系的進程之間進行通信。管道可以是匿名管道(使用pipe函數創建)或有名管道(使用mkfifo函數創建)。
- 信號(Signal):信號是一種異步的通信方式,用于通知進程發生了某個事件。進程可以通過系統調用signal或sigaction來注冊信號處理函數,當接收到特定信號時,會調用相應的處理函數進行處理。
- 共享內存(Shared Memory):共享內存是一種高效的通信方式,允許多個進程共享同一塊物理內存區域。進程可以通過映射共享內存到自己的地址空間,實現對共享數據的讀寫。
- 信號量(Semaphore):信號量是一種用于進程同步和互斥的機制。進程可以使用信號量來控制對共享資源的訪問,實現進程之間的同步和互斥。
- 消息隊列(Message Queue):消息隊列是一種有序的消息傳遞機制,進程可以通過消息隊列發送和接收消息。消息隊列提供了一種可靠的通信方式,可以實現進程之間的異步通信。
- 套接字(Socket):套接字是一種網絡編程接口,也可以用于進程間通信。進程可以通過套接字進行網絡通信,也可以通過本地套接字(Unix Domain Socket)實現本地進程間通信。
共享內存是怎么實現的?
共享內存的機制,就是拿出一塊虛擬地址空間來,映射到相同的物理內存中。這樣這個進程寫入的東西,另外一個進程馬上就能看到了,都不需要拷貝來拷貝去,傳來傳去,大大提高了進程間通信的速度。DzM28資訊網——每日最新資訊28at.com
圖片DzM28資訊網——每日最新資訊28at.com
操作系統原子操作怎么實現的?
操作系統中的原子性操作是通過硬件和軟件的支持來實現的。在多核處理器上,原子性操作需要保證在多個核心之間的并發執行中的正確性和一致性。DzM28資訊網——每日最新資訊28at.com
硬件層面上,現代處理器提供了一些特殊的指令或機制來支持原子性操作,例如原子交換(atomic exchange)、原子比較并交換(atomic compare-and-swap)等。這些指令能夠在執行期間禁止中斷或其他核心的干擾,確保操作的原子性。DzM28資訊網——每日最新資訊28at.com
軟件層面上,操作系統提供了一些原子性操作的接口或函數,例如原子操作函數(atomic operation),它們使用了硬件提供的原子性指令來實現原子性操作。這些函數通常是在內核態下執行,可以保證在多個進程或線程之間的原子性。DzM28資訊網——每日最新資訊28at.com
操作系統還可以使用鎖機制來實現原子性操作。例如,互斥鎖(mutex)可以用來保護共享資源的訪問,只有持有鎖的進程或線程可以訪問共享資源,其他進程或線程需要等待鎖的釋放。通過鎖的機制,可以保證對共享資源的原子性操作。DzM28資訊網——每日最新資訊28at.com
算法
其他
- 你對自己的職業規劃是什么?
- 平時是怎么學習的?
- 做項目過程中遇到的最大困難是什么?
- 哪個項目你覺得收益最大?
本文鏈接:http://www.tebozhan.com/showinfo-26-5143-0.html字節客戶端也瘋狂拷打基礎!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 三言兩語說透設計模式的藝術-原型模式
下一篇: 淺析 Parcel 的 Rust 打包算法 Demo