小米C++面經


1、include " " 和<> 區別

include< file >編譯程序會標准函數庫中找文件

include”file” 編譯程序會當前目錄中找文件

include語句一般用來包含標准頭文件(例如stdio.h或stdlib.h),因為這些頭文件極少被修改,並且它們總是存放在編譯程序的標准包含文件目錄下。#include“file”語句一般用來包含非標准頭文件,因為這些頭文件一般存放在當前目錄下,你可以經常修改它們,並且要求編譯程序總是使用這些頭文件的最新版本。

https://blog.csdn.net/weixin_36571185/article/details/78240931

2、static,static局部變量?生命周期?static關鍵字(全局,局部,成員變量,成員函數)

https://blog.csdn.net/weixin_40311211/article/details/82851300  (講的非常詳細)

1. 靜態局部變量:用於函數體內部修飾變量,這種變量的生存期長於該函數。

存在的意義就是隨着第一次函數的調用而初始化,卻不隨着函數的調用結束而銷毀。在第一次調用的時候初始化,且只初始化一次,也就是你第二次調用,不會繼續初始化,而會直接跳過。

那么我們總結一下,靜態局部變量的特點(與局部變量的對比):
(1)該變量在全局數據區分配內存(局部變量在棧區分配內存);
(2)靜態局部變量在程序執行到該對象的聲明處時被首次初始化,即以后的函數調用不再進行初始化(局部變量每次函數調用都會被初始化);
(3)靜態局部變量一般在聲明處初始化,如果沒有顯式初始化,會被程序自動初始化為0(局部變量不會被初始化);
(4)它始終駐留在全局數據區,直到程序運行結束。但其作用域為局部作用域,也就是不能在函數體外面使用它(局部變量在棧區,在函數結束后立即釋放內存);

2.靜態全局變量:定義在函數體外,用於修飾全局變量,表示該變量只在本文件可見

靜態全局變量不能被其它文件所用(全局變量可以);
其它文件中可以定義相同名字的變量,不會發生沖突(自然了,因為static隔離了文件,其它文件使用相同的名字的變量,也跟它沒關系了);

3.靜態函數:准確的說,靜態函數跟靜態全局變量的作用類似:

1.靜態函數不能被其它文件所用;
2.其它文件中可以定義相同名字的函數,不會發生沖突;

4.靜態數據成員:用於修飾 class 的數據成員,即所謂“靜態成員”。這種數據成員的生存期大於 class 的對象(實體 instance)。靜態數據成員是每個 class 有一份,普通數據成員是每個 instance 有一份,因此靜態數據成員也叫做類變量,而普通數據成員也叫做實例變量。
對於非靜態數據成員,每個類對象(實例)都有自己的拷貝。而靜態數據成員被當作是類的成員,由該類型的所有對象共享訪問,對該類的多個對象來說,靜態數據成員只分配一次內存。
靜態數據成員存儲在全局數據區。靜態數據成員定義時要分配空間,所以不能在類聲明中定義

5.靜態成員函數:用於修飾 class 的成員函數

1.靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;
2.非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
3.靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
4.調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,也可以用類名::函數名調用(因為他本來就是屬於類的,用類名調用很正常)

 

3、extern  externC

 

4、inline

5、堆和 棧區別

6、new malloc 區別

malloc/free是標准庫函數,new/delete是C++運算符
malloc失敗返回空,new失敗拋異常
new/delete會調用構造、析構函數,malloc/free不會,所以他們無法滿足動態對象的要求。
new返回有類型的指針,malloc返回無類型的指針
使用new操作符申請內存分配時無須指定內存塊的大小,編譯器會根據類型信息自行計算,而malloc則需要顯式地指出所需內存的尺寸。

opeartor new /operator delete可以被重載。而malloc/free則不能重載。

7、進程線程區別

根本區別:進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位

在開銷方面:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。

所處環境:在操作系統中能同時運行多個進程(程序);而在同一個進程(程序)中有多個線程同時執行(通過CPU調度,在每個時間片中只有一個線程執行)

內存分配方面:系統在運行的時候會為每個進程分配不同的內存空間;而對線程而言,除了CPU外,系統不會為線程分配內存(線程所使用的資源來自其所屬進程的資源),線程組之間只能共享資源。

包含關系:沒有線程的進程可以看做是單線程的,如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。
https://blog.csdn.net/kuangsonghan/article/details/80674777

8、進程間通信

9、一道手撕算法題  平衡數

好像是一個整數   前半部分的數字相加和后半部分的數字相加 是與一樣的 比如 1 2 2 1  這種

10、析構函數為什么要用virtual修飾?

總結一道面試題:那些函數不能定義為虛函數? 

1)友元函數,它不是類的成員函數 

2)全局函數 

3)靜態成員函數,它沒有this指針 

4)構造函數,拷貝構造函數,以及賦值運算符重載(可以但是一般不建議作為虛函數)

11、多態 說了靜態多態和動態多態,虛函數表和虛函數指針

https://blog.csdn.net/qq_42914528/article/details/82023401

函數模板 https://www.cnblogs.com/lifexy/p/8761325.html

為什么函數模板能夠執行不同的類型參數?

答:

  • 其實編譯器對函數模板進行了兩次編譯
  • 第一次編譯時,首先去檢查函數模板本身有沒有語法錯誤
  • 第二次編譯時,會去找調用函數模板的代碼,然后通過代碼的真正參數,來生成真正的函數
  • 所以函數模板,其實只是一個模具,當我們調用它時,編譯器就會給我們生成真正的函數.

12、談一下智能指針?

13、不想讓別的對象訪問本類,應該怎么做?然后自己怎么訪問的?(答:將構造函數設置成private,然后將定義一個static 函數用來訪問私有的構造函數)

14、基類、派生類調用構造函數、析構函數的順序,以及一些訪問權限問題。

15、熟悉的數據結構嗎?然后寫一個二叉樹的后序遍歷,遞歸,非遞歸。

16、給一個數組,輸出最長的連續數字子串。(一直優化)

17、協程了解過么?

 協程是更輕量級的線程。用於解決線程間切換和進程間切換的通病(對內核開銷過大),協程各個狀態(阻塞、運行)的切換是由程序控制,而不是內核控制,減少了開銷。

功能特點:通過應用層程序,記錄上下文棧區,實現在程序執行過程中的跳躍執行。由此可以選擇不阻塞的部分執行提升運行效率。

18、寫代碼,鏈表的插入與刪除的題目

https://www.nowcoder.com/discuss/256913?type=post&order=time&pos=&page=1

19、Cpp和C區別,各自的特點

https://blog.csdn.net/humeapz/article/details/81605977

1、文件區別:C源文件后綴 .c;C++源文件后綴 .cpp

2、返回值: C默認返回int型 ;C++ 若無返回值,必須指定為void

3、參數列表:C默認接收多個參數;C++默認為void,不接收任何參數

4、缺省參數:C不支持給函數參數指定默認值;C++支持

5、C++支持函數重載,C不支持

(而C++支持重載的依仗就在於C++的名字修飾與C不同,例如在C++中函數int fun(int ,int)經過名字修飾之后變為 _fun_int_int ,而C是_fun,一般是這樣的,所以C++才會支持不同的參數調用不同的函數;)

6、C指針;C++多了引用

7、C是面向過程的,C++是面向對象的。

8、結構:C中的struct和C++的類,C++的類是C所沒有的,但是C中的struct是可以在C++中正常使用的,並且C++對struct進行了進一步的擴展,C語言結構只有成員變量沒有成員方法,C++結構有自己的成員變量和成員函數。使struct在C++中可以和class一樣當做類使用,struct的成員默認訪問修飾符是public,而class默認的是private;

9、動態管理內存:C是使用malloc/free函數,C++除此之外還有new/delete關鍵字

10、C++全部變量的默認鏈接屬性是外鏈接,而C是內連接;

11、C中用const修飾的變量不可以用在定義數組時的大小,但是C++用const修飾的變量可以(如果不進行&,解引用的操作的話,是存放在符號表的,不開辟內存);

20、C可以做應用程序嗎(肯定的)

21、知道回調函數嗎

22、單例模式有用到過嗎

23、C 中為什么要加STL,它的特點,優點

24、經常用到的字符串的函數,標准的

https://www.cnblogs.com/bhlsheji/p/5287117.html

25、你知道可重入函數嗎,怎么實現的可重入,你知道static關鍵字嗎,它和可重入有什么關系

滿足下列條件的函數多數是不可重入的:
    1) 函數體內使用了靜態的數據結構;
    2) 函數體內調用了malloc()或者free()函數;
    3) 函數體內調用了標准I/O函數。

https://blog.csdn.net/lixiumin001/article/details/55255468

https://zhidao.baidu.com/question/1897433622558505220.html

https://blog.csdn.net/weiwangchao_/article/details/6916890

26、volotile關鍵字你知道嗎

27、結構體大小計算你知道嗎

28、項目中有用到過多線程嗎,多線程是自己寫的嗎,多線程相關的調用接口有哪些

https://blog.csdn.net/lmhuanying1012/article/details/75647248

29、定義一個數組A[10],不允許定義其他變量,通過指針方式取出第一個元素(感覺有坑,應該是想問數組名和指針的區別?)

30、二級指針有了解過嗎,二級指針存儲的內容

31、講一講常見的數據結構

32、隊列有用到嗎(對vector比較熟,,,那你講一下吧)

33、你上學的過程中有學到數據結構這門課嗎?知道圖嗎?

34、說一下單鏈表反轉的思路

35、樹的遍歷方式有那些

36、怎么計算二叉樹的深度

37、操作系統有學過嗎,你知道生產者消費者模型嗎?

38、你知道TCB嗎?

39、說一下死鎖,怎么避免死鎖(不知道。。。)

40、你知道同步互斥嗎

41、進程間通信了解嗎

42、給你出一個編程題,算階乘

43、驅動代碼你有了解過是嗎(沒有!)

44、你有沒有覺得計算機相關的書籍里哪些比較重要,有看過哪些書說一下

45、Python用過哪些比較多的模塊/包

46、講一下python里面的字典

47、期望工作地點

48、說一下同步異步

49、多線程怎么保證數據安全,除了加鎖還知道那些

50、項目遇到困難怎么解決

51、Linux用戶態內核態有了解過嗎

52、對小米的了解

53、C++特性

54、有幾種鎖

55、操作系統堆和棧什么區別

56、排序算法知道哪些,介紹一下 時間復雜度

57、為什么要加鎖

58、C++,多線程

https://www.nowcoder.com/discuss/244500?type=post&order=time&pos=&page=1

59、進程通信,線程同步(說了同步和通信方式后說了生產者消費者)

60、哈夫曼壓縮(舉了一個例子)

61、介紹二叉樹(講了二叉樹,AVL樹)

62、Linux的gcc(四個過程以及每一步的指令)

63、QT的信號槽(connect函數)

64、為什么有malloc還要有new(往它們的區別上答)

65、單例模式

https://blog.csdn.net/dove1202ly/article/details/81477511

66、三次握手和四次分手

67、棧逆序遞歸

68、手撕循環隊列

69、linux檢測內存使用情況;

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。

ps命令用於報告當前系統的進程狀態。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。

pmap命令用於報告進程的內存映射關系

free命令可以顯示當前系統未使用的和已使用的內存數目,還可以顯示被內核使用的內存緩沖區。

https://www.cnblogs.com/mengchunchen/p/9669704.html

70、linux查看系統的常用命令

https://www.cnblogs.com/qlqwjy/p/8571559.html

71、socket服務端建立過程

72、紅黑樹插入、紅黑樹的用途(紅黑樹沒怎么看,旋轉那一塊沒答上來);

73、兩道編程:二叉樹鏡像、集合的所有子集;

74、堆排

75、統計逆序對個數

劍指offer上利用歸並的思想將原序列分成前后兩個序列,分別統計兩個序列中的逆序對個數,再統計兩個序列中的逆序對個數,然后再合並繼續的思路;我把思想說了之后面試官就讓我手寫代碼,寫好之后他看下了應該是對的。

76、STL中的空間配置器,問了為什么自由鏈表中的是8byte的倍數?

    • 問了那個剛開始那道題: 如何在一個隊列中記錄當前隊列的最大值,這個跟那個棧的最小值有點相識,不過這個難一些,我用那個棧的思想說下我的解決思路,然后面試說你確定嚒?我說我看下,然后自己發現了問題,就把自己發現的問題跟面試官講了下,然后講了我那個解決方法的思想就是那個棧的最小值演變而來的;之后面試官提示我pop、push、getmax這三個方法都是O(n*lg(n))的時間復雜度,我說用堆嚒?他說堆插入的時間復雜度比較長,我思考了下說做不出來。
    • 最后問了那個逆序對個數的時間復雜度,讓我手推公式,我也沒推出來,然后面試官在我面前手推了一把

 77、為什么 Linux 分為內核態和用戶進程態?什么時候這二者會進行切換

之所以分開,是因為內核態可以操作更多的硬件資源,而且不用用戶去關心,如果讓用戶自己操作,可能會產生許多錯誤。用戶態切內核態有三種情況: 1. 系統調用, 2. 異常, 3. 外圍設備中斷。感覺這題和底層硬件關系密切。

 78、linux根目錄下幾個目錄的作用

79、docker原理

是一種基於容器的操作系統層級的虛擬化技術

80、線程狀態有哪些(沒刻意記過,漏了一個new)

一般說有3種,但也有說4種的
3種:
就緒:線程分配了CPU以外的全部資源,等待獲得CPU調度
執行:線程獲得CPU,正在執行
阻塞:線程由於發生I/O或者其他的操作導致無法繼續執行,就放棄處理機,轉入線程就緒隊列

第四種:
掛起:由於終端請求,操作系統的要求等原因,導致掛起。

81、分布式session共享

82、了解哪些線程模型?

 生產者消費者模型都比較熟悉,其核心是使用一個緩存來保存任務。開啟一個/多個線程來生產任務,然后再開啟一個/多個來從緩存中取出任務進行處理。這樣的好處是任務的生成和處理分隔開,生產者不需要處理任務,只負責向生成任務然后保存到緩存。而消費者只需要從緩存中取出任務進行處理。使用的時候可以根據任務的生成情況和處理情況開啟不同的線程來處理。比如,生成的任務速度較快,那么就可以靈活的多開啟幾個消費者線程進行處理,這樣就可以避免任務的處理響應緩慢的問題。

 master-worker模型類似於任務分發策略,開啟一個master線程接收任務,然后在master中根據任務的具體情況進行分發給其它worker子線程,然后由子線程處理任務。如需返回結果則worker處理結束之后把處理結果返回給master。

 

83、poll,select,epoll區別。

https://www.cnblogs.com/aspirant/p/9166944.html

84、c和c++區別

85、http和https的區別

SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:SSL記錄協議(SSL Record Protocol),它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。SSL握手協議(SSL Handshake Protocol),它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。
————————————————

1、https協議需要到CA申請證書,一般免費證書較少,因而需要一定費用。(原來網易官網是http,而網易郵箱是https。)

2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。

4、http的連接很簡單,是無狀態的。Https協議是由SSL+Http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。(無狀態的意思是其數據包的發送、傳輸和接收都是相互獨立的。無連接的意思是指通信雙方都不長久的維持對方的任何信息。)
https://blog.csdn.net/qq_38289815/article/details/80969419

86、虛函數前面加static行不行

不行

簡而言之,成員函數實例相關,靜態函數類相關。

虛函數,是一種特殊的成員函數,用來實現運行時多態。

靜態成員函數,可以不通過對象來調用,沒有隱藏的this指針。
virtual函數一定要通過對象來調用,有隱藏的this指針。
所以,關鍵問題是static成員沒有this指針。

static function 是靜態決議(編譯的時候就綁定了)

而virtual function 是動態決議的(運行時才綁定)

87、路由器和交換機的區別

https://blog.csdn.net/baidu_37964044/article/details/82289945

88、客戶端突然沒電關機,服務器怎么知道

https://blog.csdn.net/N1314N/article/details/91354169

(1)使用定時器(適合有數據流動的情況)。
(2)使用socket選項SO_KEEPALIVE(適合沒有數據流動的情況)。

89、socket和描述符說一下

90、 什么是長連接、短連接?

在HTTP/1.0中默認使用短連接。也就是說,客戶端和服務器每進行一次HTTP操作,就建立一次連接,任務結束就中斷連接。當客戶端瀏覽器訪問的某個HTML或其他類型的Web頁中包含有其他的Web資源(如JavaScript文件、圖像文件、CSS文件等),每遇到這樣一個Web資源,瀏覽器就會重新建立一個HTTP會話。

而從HTTP/1.1起,默認使用長連接,用以保持連接特性。使用長連接的HTTP協議,會在響應頭加入這行代碼:

Connection:keep-alive 

在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用於傳輸HTTP數據的TCP連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。

 

 

 

 

1.       進程和線程的區別

2.       進程線程同步情況,條件變量和信號量的區別。

3.       兩個線程循環調用,具有共享數據,使用哪種同步方式。

4.       Tcp3次握手和四次揮手,為什么是四次揮手,同步分節里面有什么。

5.       Time_wait狀態,為什么?什么時候?那個端產生的,可不可以一個msl

6.       Time_wait狀態情況下產生地址和端口占用,怎么解決(socket 中的SO_REUSEADDR)

7.       設計模式知道哪些?工廠方法什么思想?工廠如果生成新的產品需要修改代碼嗎?怎么讓他不修改代碼

8.       C++函數重載和多態,講一下,動態和靜態,虛函數,RTTI

9.       STL哪些?底層的數據結構是什么?查詢的時間復雜度

10.   Map底層

11.   stl查找有沒有什么優化的方法

12.   求n個數中最小的k個數,n是海量數據

13.   程序題1:實現一個字符串拷貝函數,需考慮目的地址與源地址有可能重合的情況. 時間:10分鍾

14.   程序題二:打印回環數字矩陣,輸入參數為邊長n,例如n=4,求如下的回環矩陣:

1    2   3  4

12  13  14  5

11  16  15  6

10  9   8   7

 

 

 

 

 

 

 

 

https://www.nowcoder.com/discuss/52218?type=post&order=time&pos=&page=2

https://www.nowcoder.com/discuss/52132?type=post&order=time&pos=&page=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM