c++相關:對c++不是很了解,雖然學過,但是學得不是很好,使用更是很少。
1.inline函數
基本的形式:
inline int min(int first, int second)
關鍵字inline要與函數的定義放在一起才能成為內聯函數:
函數的聲明和定義的區別:
inline void Foo(int x);
inline void Foo(int x){ .... }
inline是"用於實現的關鍵字",不是用於生成的關鍵字。聲明相當於對外接口,調用者並不需要了解,是否是內聯實現。
定義在類中的成員函數自動成為內聯函數。
class A { public: void Foo(int x, int y)//自動地成為內聯函數 { ....... } };
如果內聯函數中的代碼過長或者有循環,那么不推薦是用內聯函數。
使用內聯函數的關鍵字不一定會在編譯器中展開,編譯器是有選擇性的。
頭文件中包含的inline函數的定義而非聲明。
不可以不同的源文件中定義函數名相同但實現不同的inline函數,會發生沖突。
內聯函數機制既具備宏代碼的效率,又增加了安全性,並且可以自由的操作類中的數據成員。
宏代碼的機制:#define 本身不是函數,但是使用起來像函數。編譯預處理器用拷貝宏代碼的方式取代函數調用,省去參數壓棧,call調用,返回參數,return過程,提高了速度。但是容易出錯,拷貝宏代碼時會產生邊際效應。不可以調試。無法操作私有數據成員。assert除外,用於宏定義,不是函數。
內聯函數可以調試:在debug版本中沒有真正內聯,像普通函數一樣,release版本中才會真正內聯。
數據結構:
1.進制問題 一些概念理解不清
n位的2進制:
2^(n-1)*(an)+2^(n-2)*an-1+.....2^(0)*(a0)
問題:
假設在n進制下,下面的等式成立,n值是()240*12=2880 解答: (2*(n^2)+4*(n^1)+0*1)*(1*(n^1)+2*(n^0))=2*(n^3)+8*(n^2)+8*(n^1)+0 等式恆成立,所以結果是任意進制
2.線性表
循環鏈表是另一種形式的鏈式存儲結構。將鏈表中最后一個指針域從null改變為開始節點。
隊列是只允許在一端插入另一端刪除的鏈式結構。
棧是在棧頂進行插入,刪除的鏈式結構。
“關聯數組”是一種具有特殊索引方式的數組。不僅可以通過整數來索引它,還可以使用字符串或者其他類型的值(除了NULL)來索引它。不是線性表。
3.struct類型的大小:
64位處理器中:指針為8個字節,int是4個字節,char是1個字節,總共13字節,但是struct必須是8的整數倍,所以16個字節。
4.iterator.erase()方法
是刪除當前的字符,指針指向下一個字符。
#include <iostream> #include <vector> using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(*itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<""; } return 0; }
答案為:
100 300 300 500
5.
c錯誤原因:類的常量才是不可修改。
關於靜態成員的特性可參考借鑒另一個博客:http://www.cnblogs.com/morewindows/archive/2011/08/26/2154198.html謝謝。
linux:
linux是一點都不了解的。
1.linux多路復用I/O接口select和epoll來實現高並發
區別:select輪詢方式,效率低,epoll是觸發式的,效率較高
1:select中socket的數量是有限制的,由FD_SETSIZE決定一般是1024.通過遍歷FD_SETSIZE1024個socket來決定調度哪個socket,不管是否活躍都會全部遍歷一次。
2.epoll無限制,是觸發式的,當有socket事活躍態的時候則callback,若所有的都是活躍態則回到了遍歷方式。
socket數量限制問題的解決:
1.修改FD_SETSIZE定義的宏,重新編譯進內核,但是這會導致網絡質量的下降。
2.實現多進程。
epoll不會IO效率不隨FD數目增加而線性下降
Select會
epoll的適用情景就是大量的socket,但是活躍多不是很高的情況。epoll通過共享存儲實現內核和用戶的數據交互。