自我介紹
- 部門是做什么的,百度搜索架構部,是百度搜索的主要部門,日常負責維護百度搜索以及搜索優化。
C++問題
- 聲明和定義的區別?
聲明是將一個名稱引入程序。定義提供了一個實體在程序中的唯一描述,涉及到內存空間的分配以及初始值的設定。聲明和定義有時是同時存在的。
常見的賦值語句為定義即聲明。
幾種只聲明不定義的情況:
void display(); 提供函數聲明
extern int a;
class A;
typedef 聲明;
在類中定義的靜態數據成員的聲明
- 內存分配的幾種方式?
棧區(Stack): 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其
操作方式類似於數據結構中的棧。
堆區(Heap): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回
收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。
全局區(靜態區靜態static):全局變量和靜態變量的存儲是放在一塊的,初始化的
全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 程序結束后由系統釋放。
文字常量區 (Stack):常量字符串就是放在這里的。 程序結束后由系統釋放。
程序代碼區(Stack):存放函數體的二進制代碼。
棧區和堆區的區別
堆和棧中的存儲內容:棧存局部變量、函數參數等。
堆存儲使用new、malloc申請的變量等。
申請方式:棧內存由系統分配,堆內存由自己申請。
申請后系統的響應:
棧:只要棧的剩余空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,並將該結點的空間分配給程序。
申請大小的限制:Windows下棧的大小一般是2M,堆的容量較大。
申請效率的比較:棧由系統自動分配,速度較快。堆使用new、malloc等分配,較慢。
總結:棧區優勢在處理效率,堆區優勢在於靈活。
- memcpy和memset的區別?為什么memset不能初始化一些其他類。
對於memcpy:
功能:由src所指內存區域復制count個字符串到dest所指內存區域.
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針.
對於memset:
功能:把buffer所指內存區域的前count個字節設置成字符c
說明:返回指向buffer的指針.
memset 用來對一段內存空間全部設置為某個字符,一般用於在對定義的字符串初始化為' '
memcpy 是用來做內存拷貝,可以用來拷貝任何數據類型的對象,可以指定拷貝的數據長度.
memset是一個字節一個字節設置的,取要賦的值的后8位二進制進行賦值。所以當memset賦值為1時會出現錯誤。
-
c++使用c代碼使用什么關鍵字?
使用 extern "C" {}. -
const關鍵字以及其使用場景?
- const變量: 不能修改值,定義時初始化 const int pi = 3.1415;
- const類對象: 不能修改成員變量的值,不能調用非const函數。const myClass a;
- 指向const變量的指針:指向內容不可變,指向可變. const int* a;
- const 指針:指向內容可變,指向不可變。 int* const a;
- 指向 const 變量的 const 指針。指向不可變,指向內容也不可變。const int* const a;
- const 變量作為函數參數。函數內部不能修改該參數值。void myFun(const int a);
- const 返回值. 用以返回const引用,上層不能用返回的引用來修改對象。 const string& myFun()
- const 成員變量. 必須在初始化列表進行初始化,之后不能改變。
- const 成員函數。 此函數不應該修改任何成員變量,傳給const成員函數的this指針,是指向const對象的const指針。
內存問題
- 內存分配的幾種方式?
從全局存儲區域分配:這時內存在程序編譯階段就已經分配好,該內存在程序運行的整個周期都有效,如:全局變量、static靜態變量。
從棧區分配:在執行函數的時候,函數中的局部變量的存儲單元都可以從棧中分配,函數執行結束后這些存儲單元都會被自動釋放,實現從棧中分配存儲單元運算操作內置於處理器的指令集中,效率很高 但是分配的內存容量有限。
從堆中分配:也稱為動態內存分配,在程序運行期間,可以使用malloc和new申請任意數量的內存單元,由程序員決定在什么時候使用free和delete釋放內存。
操作系統問題
-
進程和線程之間的區別?
進程是具有一定獨立功能的程序、它是系統進行資源分配和調度的一個獨立單位,重點在系統調度和單獨的單位,也就是說進程是可以獨立運行的一段程序。
線程又是什么?線程進程的一個實體,是CPU調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位,線程自己基本上不擁有系統資源。
聯系:- 一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程(通常說的主線程)。
- 資源分配給進程,同一進程的所有線程共享該進程的所有資源。
- 線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
- 處理機分給線程,即真正在處理機上運行的是線程。
- 線程是指進程內的一個執行單元,也是進程內的可調度實體。
-
進程間通信的方式?
- 管道/匿名管道(pipe):
- 有名管道(FIFO)
- 信號(Signal)
- 消息(Message)隊列
- 共享內存(share memory)
- 信號量(semaphore)
- 套接字(socket)
-
線程對內存進行讀寫時會出現哪些問題?怎么解決這些問題?
- 臨界區(Critical Section)
- 互斥量(Mutex)
- 信號量(Semaphores)
- 事件(Event)
- 隊列
-
cpu調度機制?
- 先到先服務調度算法(FCFS)
- 最短作業優先調度(SJF)
- 優先級調度
- 輪轉法調度(RR)
- 多級隊列調度
- 多級反饋隊列調度
編程題
- 快排
- 合並兩個有序鏈表
