小米C++开发 面试 准备阶段和部分真题
真題
C++
- 函數(shù)指針和指針函數(shù)的區(qū)別? o(╥﹏╥)o
- 堆和棧的區(qū)別
- 函數(shù)重載?為什么返回值不可以區(qū)分函數(shù)重載?o(╥﹏╥)o
- 封裝、繼承和多態(tài)的定義,自己描述一下這三者的區(qū)別和聯(lián)系。
- 多態(tài)的構(gòu)成(應(yīng)該是想聽虛函數(shù),當(dāng)時(shí)沒有想到? o(╥﹏╥)o)
- 必須存在繼承關(guān)系
- 繼承關(guān)系中必須存在同名的虛函數(shù),并且子類和基類虛函數(shù)之間是遮蔽(覆蓋)的關(guān)系
- 存在基類指針,通過這個(gè)指針實(shí)現(xiàn)虛函數(shù)的調(diào)用
- 進(jìn)程相較于線程 還多包含一個(gè)socket通信o(╥﹏╥)o
- STL
密碼學(xué)
- RSA padding模式是啥? 大
- RSA的位數(shù) 1024 2048 4096
- 密碼體制? 密碼的底層原理
- 橢圓雙曲線
- 對(duì)稱算法的模式? ofb? cfb
- 服務(wù)器密碼機(jī)如何對(duì)外提供服務(wù)?帶寬
區(qū)塊鏈
- 數(shù)字錢包的標(biāo)準(zhǔn)
- 檢測賬戶余額的方法 UTXO
?準(zhǔn)備階段
C++
1,fork的底層實(shí)現(xiàn)是什么?
fork()函數(shù)的底層實(shí)現(xiàn)原理_everthing willl be ok-CSDN博客_fork原理
- fork()系統(tǒng)調(diào)用通過復(fù)制一個(gè)現(xiàn)有進(jìn)程來創(chuàng)建一個(gè)全新的進(jìn)程。進(jìn)程被存放在一個(gè)叫做任務(wù)隊(duì)列的雙向循環(huán)鏈表當(dāng)中,鏈表當(dāng)中的每一項(xiàng)都是類型為task_struct稱為進(jìn)程描述符的結(jié)構(gòu),也就是我們寫過的進(jìn)程PCB.?
- Tips:內(nèi)核通過一個(gè)位置的進(jìn)程標(biāo)識(shí)值或PID來標(biāo)識(shí)每一個(gè)進(jìn)程。//最大值默認(rèn)為32768,short int短整型的最大值.,他就是系統(tǒng)中允許同時(shí)存在的進(jìn)程最大的數(shù)目。
- 可以到目錄 /proc/sys/kernel中查看pid_max:
當(dāng)進(jìn)程調(diào)用fork后,當(dāng)控制轉(zhuǎn)移到內(nèi)核中的fork代碼后,內(nèi)核會(huì)做4件事情:
- 1、分配新的內(nèi)存塊和內(nèi)核數(shù)據(jù)結(jié)構(gòu)給子進(jìn)程
- 2、將父進(jìn)程部分?jǐn)?shù)據(jù)結(jié)構(gòu)內(nèi)容拷貝至子進(jìn)程
- 3、添加子進(jìn)程到系統(tǒng)進(jìn)程列表當(dāng)中
- 4、fork返回,開始調(diào)度器調(diào)度
?fork函數(shù)在底層到底做了什么呢?
-
Linux平臺(tái)通過clone()系統(tǒng)調(diào)用實(shí)現(xiàn)fork()。 fork(),vfork()和clone()庫函數(shù)都根據(jù)各自需要的參數(shù)標(biāo)志去調(diào)用clone(),然后由clone()去調(diào)用do_fork(), 再然后do_fork()完成了創(chuàng)建中的大部分工作,該函數(shù)調(diào)用copy_process().做最后的那部分工作。
2,智能指針原理、使用和實(shí)現(xiàn)
理解智能指針
C++11中智能指針的原理、使用、實(shí)現(xiàn) - wxquare - 博客園
- 智能指針是利用了一種叫做RAII(資源獲取即初始化)的技術(shù)對(duì)普通的指針進(jìn)行封裝,這使得智能指針實(shí)質(zhì)是一個(gè)對(duì)象,行為表現(xiàn)的卻像一個(gè)指針
- 智能指針的作用是防止忘記調(diào)用delete釋放內(nèi)存和程序異常的進(jìn)入catch塊忘記釋放內(nèi)存。另外指針的釋放時(shí)機(jī)也是非常有考究的,多次釋放同一個(gè)指針會(huì)造成程序崩潰,這些都可以通過智能指針來解決
智能指針占據(jù)的字節(jié)數(shù)
- shared_ptr? 16字節(jié)
- unique_ptr? 8字節(jié)
- weak_ptr? 16字節(jié)
3,虛函數(shù)
C++虛函數(shù)詳解_C語言中文網(wǎng)
C++ 虛函數(shù)表解析_陳皓專欄 【空谷幽蘭,心如皓月】-CSDN博客_虛函數(shù)表
C++虛函數(shù)詳解_Whitesad的博客-CSDN博客_c++虛函數(shù)
- 只有派生類的虛函數(shù)遮蔽基類的虛函數(shù)(函數(shù)原型相同)才能構(gòu)成多態(tài)(通過基類指針訪問派生類函數(shù))
- 虛函數(shù)的聲明的前提:首先看成員函數(shù)所在的類是否會(huì)作為基類。然后看成員函數(shù)在類的繼承后有無可能被更改功能,如果希望更改其功能的,一般應(yīng)該將它聲明為虛函數(shù)。如果成員函數(shù)在類被繼承后功能不需修改,或派生類用不到該函數(shù),則不要把它聲明為虛函數(shù)
- 虛函數(shù)是運(yùn)行時(shí)決議,與一般的編譯時(shí)決議存在很大的不同
- 虛函數(shù)指針:虛函數(shù)指針式一個(gè)指向函數(shù)的指針,指向的是子類內(nèi)部實(shí)現(xiàn)的虛函數(shù),當(dāng)子類調(diào)用虛函數(shù)的時(shí)候,本質(zhì)上是通過調(diào)用這個(gè)虛函數(shù)指針找到接口
- 虛函數(shù)指針是確實(shí)存在的數(shù)據(jù)類型,在一個(gè)被實(shí)例化的對(duì)象中,它總是被存放在該對(duì)象的地址首位,這種做法的目的是為了保證運(yùn)行的快速性。與對(duì)象的成員不同,虛函數(shù)指針對(duì)外部是完全不可見的,除非通過直接訪問地址的做法或者在DEBUG模式中,否則它是不可見的也不能被外界調(diào)用
4,C++轉(zhuǎn)型操作符? 強(qiáng)制類型轉(zhuǎn)換
- const_cast?通常用來將對(duì)象的常量性轉(zhuǎn)除(cast away the constness)。它是唯一有此能力的C++-style轉(zhuǎn)型操作符
- dynamic_cast用來執(zhí)行繼承體系中安全的向下轉(zhuǎn)型或跨系轉(zhuǎn)型動(dòng)作。也就是說你可以利用它將指向基類對(duì)象的指針或者引用轉(zhuǎn)型為指向派生類對(duì)象的指針或引用,并得知轉(zhuǎn)型是否成功。如果轉(zhuǎn)型失敗,會(huì)以一個(gè)null指針(當(dāng)轉(zhuǎn)型對(duì)象是指針)或一個(gè)exception(當(dāng)轉(zhuǎn)型對(duì)象是引用)表現(xiàn)出來。dynamic_cast是唯一無法由舊式語法執(zhí)行的轉(zhuǎn)型動(dòng)作,也是唯一可能消耗重大運(yùn)行成本的轉(zhuǎn)型動(dòng)作
- static_cast?基本上擁有與C舊式轉(zhuǎn)型相同的威力與意義,以及相同的限制。例如將一個(gè)非?const?的對(duì)象轉(zhuǎn)換為?const?對(duì)象,或?qū)nt?轉(zhuǎn)換為?double等等。它也可以用來執(zhí)行上述多種轉(zhuǎn)換的反向轉(zhuǎn)換,例如將void*指針轉(zhuǎn)為typed指針,將pointer-to-base轉(zhuǎn)為pointer-to-derived。但是他無法將const轉(zhuǎn)為non-const,這個(gè)只有const-cast才能夠辦到
- reinterpret_cast意圖執(zhí)行低級(jí)轉(zhuǎn)型,實(shí)際動(dòng)作及結(jié)果可能取決于編譯器,這也就表示它不可移植。例如將一個(gè)pointer to int?轉(zhuǎn)型為int。這一類轉(zhuǎn)型在低級(jí)代碼以外很少見
5,new和malloc的區(qū)別
c++ new 與malloc有什么區(qū)別 - ywliao - 博客園
- new操作符從自由存儲(chǔ)區(qū)(free store)上為對(duì)象動(dòng)態(tài)分配內(nèi)存空間,而malloc函數(shù)從堆上動(dòng)態(tài)分配內(nèi)存。自由存儲(chǔ)區(qū)是否能夠是堆(問題等價(jià)于new是否能在堆上動(dòng)態(tài)分配內(nèi)存),這取決于operator new 的實(shí)現(xiàn)細(xì)節(jié)。自由存儲(chǔ)區(qū)不僅可以是堆,還可以是靜態(tài)存儲(chǔ)區(qū),這都看operator new在哪里為對(duì)象分配內(nèi)存。
- new操作符內(nèi)存分配成功時(shí),返回的是對(duì)象類型的指針,類型嚴(yán)格與對(duì)象匹配,無須進(jìn)行類型轉(zhuǎn)換,故new是符合類型安全性的操作符。而malloc內(nèi)存分配成功則是返回void * ,需要通過強(qiáng)制類型轉(zhuǎn)換將void*指針轉(zhuǎn)換成我們需要的類型。
- new內(nèi)存分配失敗時(shí),會(huì)拋出bac_alloc異常,它不會(huì)返回NULL;malloc分配內(nèi)存失敗時(shí)返回NULL。
- 使用new操作符申請(qǐng)內(nèi)存分配時(shí)無須指定內(nèi)存塊的大小,編譯器會(huì)根據(jù)類型信息自行計(jì)算,而malloc則需要顯式地指出所需內(nèi)存的尺寸。
?5,C++仿照標(biāo)準(zhǔn)字符串類string,設(shè)計(jì)一個(gè)自己的字符串類String
C++仿照標(biāo)準(zhǔn)字符串類string,設(shè)計(jì)一個(gè)自己的字符串類String_之古的博客-CSDN博客_設(shè)計(jì)一個(gè)字符串類string
?主要的任務(wù)
- 1)數(shù)據(jù)成員是字符指針,可自動(dòng)適應(yīng)不同的串長度。
- 2)串復(fù)制,既可使用字符串常量進(jìn)行復(fù)制,也可以使用其他的字符串對(duì)象進(jìn)行復(fù)制。
- 3)串賦值。既可賦值為字符串常量,也可以賦值為使用其他的字符串對(duì)象。
- 4)串連接。重載“+”和“+=”。
- 5)重載下標(biāo)運(yùn)算符[]。
- 6)串比較。重載“==”和“<”。
- 7)字符串輸入和輸出。重載“>>”和“<<”。
6,文件編譯的過程
C 文件編譯的過程_sxy19930313的博客-CSDN博客
gcc編譯程序的四個(gè)階段(預(yù)處理-編譯-匯編-鏈接)_Aikenlan的博客-CSDN博客
預(yù)編譯 :
- 處理所有的注釋 , 以空格代替
- 將所有的 #define刪除 ,并且展開所有的宏定義
- 處理?xiàng)l件編譯指令#if、#ifdef、#elf、#else、#endif
- 處理#include,展開被包含的文件
- 保留編譯器需要使用的#pragma指令
- 預(yù)處理指令:gcc ?? -E? file.c? -o? hello.i ????
編譯
- 對(duì)預(yù)處理的文件進(jìn)行一系列詞法分析、語法分析和語義分析
- 詞法分析主要分析關(guān)鍵字,標(biāo)識(shí)符,立即數(shù)等是否合法? ? ? ? ? ? ?
- 語法分析主要分析表達(dá)式是否遵循語法規(guī)則? ? ? ? ? ? ? ? ?
- 語義分析是在語法分析的基礎(chǔ)上進(jìn)一步分析表達(dá)式是否合法 ? ? ? ?
- 分析結(jié)束后進(jìn)行代碼優(yōu)化生成相應(yīng)的匯編代碼文件 ? ? ? ? ? ?
- 編譯指令: ?gcc ? -S ?file.c ?-o hello.s
匯編
- 匯編器將匯編代碼轉(zhuǎn)變?yōu)闄C(jī)器可以執(zhí)行的指令 ?
- 匯編階段生成 二進(jìn)制代碼
- 每個(gè)匯編語句幾乎都對(duì)應(yīng)一條機(jī)器指令 匯編指令:gcc ?-c file.s ?-o ?hello.o? ? ? ? ? ? ?
鏈接
- ? ?鏈接器的主要作用是把各個(gè)模塊之間相互引用的部分處理好,使得各個(gè)模塊之間能夠正確的銜接
- 靜態(tài)鏈接:在編譯期間完成,鏈接文件是以目標(biāo)文件為單位的,如果有多個(gè)可執(zhí)行文件調(diào)用同一個(gè)函數(shù),則該函數(shù)的目標(biāo)文件就會(huì)生成多個(gè)副本,并與多個(gè)可執(zhí)行文件一一對(duì)應(yīng)。這樣就造成來了內(nèi)存空間得了浪費(fèi),同時(shí)函數(shù)庫的更新也很麻煩。優(yōu)點(diǎn)是程序在運(yùn)行的時(shí)候已經(jīng)包含了所有的程序,運(yùn)行速度較快
- ?動(dòng)態(tài)鏈接:在運(yùn)行期間完成
?7,并行和并發(fā)的區(qū)別
面試必考的:并發(fā)和并行有什么區(qū)別? - 云+社區(qū) - 騰訊云
- 并發(fā)一段時(shí)間內(nèi)? 實(shí)現(xiàn)兩個(gè)程序的執(zhí)行? 不可以同時(shí)
- 并行是同一時(shí)刻? 實(shí)現(xiàn)兩個(gè)程序的執(zhí)行? 可以同時(shí)
?8,中斷
為什么需要中斷?_jwy2014的專欄-CSDN博客_為什么要使用中斷
什么是中斷,為什么要用中斷?_old-li的blog-CSDN博客
9,邏輯地址 和 物理地址的區(qū)別
物理地址、虛擬地址和邏輯地址之間的區(qū)別_SoaringLee_fighting的技術(shù)專欄-CSDN博客
- 物理地址就是,機(jī)器內(nèi)主存的地址,包括RAM和ROM
- 邏輯地址就是,程序運(yùn)行在內(nèi)存中,使用的地址。
- 虛擬地址就是,cpu支持的內(nèi)存空間遠(yuǎn)遠(yuǎn)大于機(jī)器主存的大小,這些多出來的空間對(duì)于程序來說是可以用的,這個(gè)時(shí)候的所有地址都稱為虛擬地址
補(bǔ)充
C++ Primer:常量引用、引用常量、常量指針、指針常量 - 簡書
- 函數(shù)指針? 指針函數(shù)
- 常量指針? 指針常量
- 數(shù)組指針? 指針數(shù)組
- 常量引用? 引用常量
函數(shù)指針 和? 指針函數(shù)的區(qū)別
C++ 函數(shù)指針和指針函數(shù)-CJavaPy
指針函數(shù)
- 指針函數(shù)本質(zhì)是返回指針的函數(shù),其本質(zhì)是一個(gè)函數(shù),返回的類型是指針。int *myfun(int x,int y);??在函數(shù)名前面多了一個(gè)*號(hào),而這個(gè)函數(shù)就是一個(gè)指針函數(shù)。其返回值是一個(gè) int 類型的指針。
- 在調(diào)用指針函數(shù)時(shí),需要一個(gè)同類型的指針來接收其函數(shù)的返回值。 也可以將其返回值定義為 void*類型,調(diào)用時(shí)強(qiáng)制轉(zhuǎn)換返回值為想要的類型。
函數(shù)指針
- 函數(shù)指針,其本質(zhì)是一個(gè)指針變量,該指針指向這個(gè)函數(shù)。函數(shù)指針就是指向函數(shù)的指針。聲明格式如下:int (*myfun)(int x,int y);
區(qū)別
1)定義不同
- 指針函數(shù)本質(zhì)是一個(gè)函數(shù),其返回值為指針。
- 函數(shù)指針本質(zhì)是一個(gè)指針,其指向一個(gè)函數(shù)。
2)寫法不同
- 指針函數(shù):int* fun(int x,int y);
- 函數(shù)指針:int (*fun)(int x,int y);
- 函數(shù)名帶括號(hào)的就是函數(shù)指針,否則就是指針函數(shù)。
3)用法不同
- 一個(gè)是函數(shù),一個(gè)是變量
對(duì)特定地址進(jìn)行賦值
如何給地址賦值?(轉(zhuǎn)) - 張凌001 - 博客園
C語言中給指定的內(nèi)存地址賦值(通過指針)_phenixyf的專欄-CSDN博客
- 對(duì)于i分配的地址具有訪問權(quán)限?
?全局變量和靜態(tài)全局變量 區(qū)別
全局變量和靜態(tài)全局變量_calm_peng-CSDN博客_靜態(tài)全局變量
靜態(tài)函數(shù)和普通函數(shù)的區(qū)別
static函數(shù)與普通函數(shù)的區(qū)別:用static修飾的函數(shù),本限定在本源碼文件中,不能被本源碼文件以外的代碼文件調(diào)用。而普通的函數(shù),默認(rèn)是extern的,也就是說,可以被其它代碼文件調(diào)用該函數(shù)。在函數(shù)的返回類型前加上關(guān)鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。普通 函數(shù)的定義和聲明默認(rèn)情況下是extern的,但靜態(tài)函數(shù)只是在聲明他的文件當(dāng)中可見,不能被其他文件所用。因此定義靜態(tài)函數(shù)有以下好處:<1> 其他文件中可以定義相同名字的函數(shù),不會(huì)發(fā)生沖突。<2> 靜態(tài)函數(shù)不能被其他文件所用。計(jì)算機(jī)網(wǎng)絡(luò)
OSI七層網(wǎng)絡(luò)模型,以及每層對(duì)于的網(wǎng)絡(luò)協(xié)議
OSI七層模型及對(duì)應(yīng)的網(wǎng)絡(luò)協(xié)議_小麻花-CSDN博客_七層模型對(duì)應(yīng)的協(xié)議
https的底層實(shí)現(xiàn),原理是什么?
HTTPS底層實(shí)現(xiàn)原理_風(fēng)某人~Wind的博客-CSDN博客_https的底層原理
- 證書(CRT文件,里面包含了公鑰,CA的簽名,過期時(shí)間,申請(qǐng)人提交的信息)
- https = http+SSL 12次
TCP? UDP 區(qū)別
一文搞懂TCP與UDP的區(qū)別 - Fundebug - 博客園
| UDP | TCP | |
| 是否連接 | 無連接 | 面向連接 |
| 是否可靠 | 不可靠傳輸,不使用流量控制和擁塞控制 | 可靠傳輸,使用流量控制和擁塞控制 |
| 連接對(duì)象個(gè)數(shù) | 支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多交互通信 | 只能是一對(duì)一通信 |
| 傳輸方式 | 面向報(bào)文 | 面向字節(jié)流 |
| 首部開銷 | 首部開銷小,僅8字節(jié) | 首部最小20字節(jié),最大60字節(jié) |
| 適用場景 | 適用于實(shí)時(shí)應(yīng)用(IP電話、視頻會(huì)議、直播等) | 適用于要求可靠傳輸?shù)膽?yīng)用,例如文件傳輸 |
?
Linux
Linux 驅(qū)動(dòng)模型?
Linux驅(qū)動(dòng)學(xué)習(xí):應(yīng)先了解驅(qū)動(dòng)模型 - 知乎
[Linux]互斥機(jī)制(中斷屏蔽、原子操作、自旋鎖、信號(hào)量)
[Linux]互斥機(jī)制(中斷屏蔽、原子操作、自旋鎖、信號(hào)量)_Younix凌亂的草稿本-CSDN博客
Linux進(jìn)程之間通信方式
進(jìn)程間8種通信方式詳解 - 云+社區(qū) - 騰訊云
進(jìn)程間通信的方式——信號(hào)、管道、消息隊(duì)列、共享內(nèi)存 - 0giant - 博客園
用戶態(tài)和內(nèi)核態(tài)的區(qū)分
用戶態(tài)和內(nèi)核態(tài)的區(qū)別 - Gizing - 博客園
查看linux的位數(shù) 不能使用sizeof
查看當(dāng)前l(fā)inux系統(tǒng)位數(shù) - controlV - 博客園
- uname -a
- uname -r
參考資料
- C++進(jìn)階問題-智能指針&繼承&sizeof - 杭河葦 - 博客園
總結(jié)
以上是生活随笔為你收集整理的小米C++开发 面试 准备阶段和部分真题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机银行如何转账到别人银行卡
- 下一篇: C++ std::iota递增