1. HASH和BST的區別, 應用場景
HASH時間復雜度O(1) BST為O(lgN), 但HASH需要的內存空間較大 所以HASH適合查詢速度要求高 內存空間充足的情況
HASH不適合對一個范圍的查找
HASH在輸入集合不確定的情況下 可能會產生大量沖突 所以HASH適合輸入集合確定的情況 而BST適合動態的查找的刪除
ref.
http://topic.csdn.net/u/20081129/15/5ff0434e-7d86-4a08-b107-d5b4b58e394d.html
2. malloc和new的區別
malloc是個函數 new是個運算符
malloc分配一塊無類型未初始化的內存空間 返回指向這塊內存的void* new操作調用類的構造函數生成對象 返回指向對象的指針(無類型和有類型)
3. alloca, malloc, calloc, realloc和free的區別
alloca向棧申請空間,無須釋放
malloc返回一塊無類型未初始化內存
calloc返回一塊無類型初始化過的內存
malloc() 函數和calloc ()函數的另一點區別是calloc()函數會返回一個由某種對象組成的數組,但malloc()函數只返回一個對象。
realloc重新分配內存大小 并返回一個新地址
free 釋放的內存并不立即返回給os,而是保留在內部結構中.
PS. brk類似于批發,一次性的向OS申請大的內存,而malloc等函數則類似于零售,滿足程序運行時的要求.這套機制類似于緩沖.
使用這套機制的原因: 系統調用不能支持任意大小的內存分配(有的系統調用只支持固定大小以及其倍數的內存申請,這樣的話,對于小內存的分配會造成浪費; 系統調用申請內存代價昂貴,涉及到用戶態和核心態的轉換.
ref.
http://hi.baidu.com/frh_jlu/blog/item/c21ec2ce3ac7a03cb700c86a.html
4. inline和宏的區別
inline是編譯階段的代碼嵌入 是函數 有類型檢查 不能為虛函數
宏是預編譯階段的簡單代碼替換
5. 虛函數和虛函數表
6. 多態和虛函數
7. select和epoll的區別<socket1輪詢,2端口限制 epoll1事件響應,2紅黑樹>
select的特點:select 選擇句柄的時候,是遍歷所有句柄,也就是說句柄有事件響應時,select需要遍歷所有句柄才能獲取到哪些句柄有事件通知,因此效率是非常低。但是如果連接很少的情況下, select和epoll的LT觸發模式相比, 性能上差別不大。
這里要多說一句,select支持的句柄數是有限制的, 同時只支持1024個,這個是句柄集合限制的,如果超過這個限制,很可能導致溢出,而且非常不容易發現問題, TAF就出現過這個問題, 調試了n天,才發現:)當然可以通過修改linux的socket內核調整這個參數。
epoll的特點:epoll對于句柄事件的選擇不是遍歷的,是事件響應的,就是句柄上事件來就馬上選擇出來,不需要遍歷整個句柄鏈表,因此效率非常高,內核將句柄用紅黑樹保存的。
8. epoll的兩種觸發方式的區別, 應用場景
水平觸發和邊沿觸發 前者會不斷通知直到事件被處理 效率略低但可靠性高 后者只通知一次 適合性能要求高的場景
LT:水平觸發,效率會低于ET觸發,尤其在大并發,大流量的情況下。但是LT對代碼編寫要求比較低,不容易出現問題。LT模式服務編寫上的表現是:只要有數據沒有被獲取,內核就不斷通知你,因此不用擔心事件丟失的情況。
ET:邊緣觸發,效率非常高,在并發,大流量的情況下,會比LT少很多epoll的系統調用,因此效率高。但是對編程要求高,需要細致的處理每個請求,否則容易發生丟失事件的情況。
epoll默認是水平觸發, 可以在ev.event設置EPOLLIN EPOLLOUT時加上EPOLLET 設為邊沿觸發
ref.
http://www.vimer.cn/2009/10/epoll%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F%E8%AF%A6%E8%A7%A3.html9. 進程和線程的區別
進程就是程序的一次執行 進程間是獨立的 一個進程可以有多個線程 線程共享進程的內存空間 但有自己獨立的ID, 堆棧(在進程空間內外??)和上下文
10. 交換機和路由器的區別
11. sizeof和strlen的區別
sizeof是操作符 strlen是函數
sizeof是編譯階段的類型替換 假如int a=5; sizeof(a=3)后a還是5 a=3不會被執行 sizeof(f())會返回返回值類型
12. struct和class的區別
struct默認為public 而class默認為private
struct一般在棧上 而new class一般在堆中
13. static的幾個作用
靜態全局變量: 作用域僅本文件
靜態局部變量: 函數運行結束 變量值也不會改變 函數下次使用仍然能用到這個值 這就像C++class里邊static的東西 class出來的對象都能夠共用這個static的變量(static.cpp)
static第一個意思是表示退出一個塊后仍然存在的局部變量,第二個意思是表示不能被其它文件訪問的全局變量和函數
修飾類中的成員數據: 共享靜態數據
修飾類中的成員函數: 沒有this參數
14. reactor和proactor的區別
reactor是同步的 proactor是異步的
reactor讀寫操作由處理器完成 proactor的讀寫操作是異步的
處理器發起一個異步IO操作,再由事件分離器等待IOCompletion事件。