基礎篇
1.const *和* const的區別
如果const修飾在*p前則不能改的是*p,而不是指p;
如果const是直接寫在p前,則p不能改
舉個栗子:
int i1=30
int i2=40;
const int *p = &i1
p前並沒有用const修飾,所以p是指標變數。能被賦值重新指向另乙個記憶體位址。
p=&i2; //正確
*p=i2; //錯誤
int * const p
指標p因為有了const的修飾,所以為指標常量,即,指標p不能修改了。
p=&i2; //錯誤
*p=i2; //正確
說真的把 * const的應用場景非常少,好像我都想不起來我**用過。。。
2.不借助第3個變數交換a和b的值(c語言)
標準演算法
int a,b;
a=10; b=15;
int t;
t=a; a=b; b=t;
算術運算
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=12;b=10
指標位址操作
int *a,*b; //假設
*a=new int(10);
*b=new int(20); //&a=0x00001000h,&b=0x00001200h
a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h
b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h
a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
位運算
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
而從實際的軟體開發看,標準演算法無疑是最好的,能夠解決任意型別的交換問題。
我個人覺得這樣的面試毫無意義,誰要是在專案開發的邏輯**寫位運算的方法,我tm想打他一頓,當然如果是封裝的介面可以這樣寫,你寫好介面的注釋即可,我不關心你實現過程。
3.程序和執行緒的區別,程序間通訊方法,執行緒間通訊方法
程序和執行緒的關係:
(1)乙個執行緒只能屬於乙個程序,而乙個程序可以有多個執行緒,但至少有乙個執行緒。
(2)資源分配給程序,同一程序的所有執行緒共享該程序的所有資源。
(3)處理機分給執行緒,即真正在處理機上執行的是執行緒。
(4)執行緒在執行過程中,需要協作同步。不同程序的執行緒間要利用訊息通訊的辦法實現同步。
(5)執行緒是指程序內的乙個執行單元,也是程序內的可排程實體.
與程序的區別:
(1)排程:執行緒作為排程和分配的基本單位,程序作為擁有資源的基本單位
(2)併發性:不僅程序之間可以併發執行,同乙個程序的多個執行緒之間也可併發執行
(3)擁有資源:程序是擁有資源的乙個獨立單位,執行緒不擁有系統資源,但可以訪問隸屬於程序的資源.
(4)系統開銷:在建立或撤消程序時,由於系統都要為之分配和**資源,導致系統的開銷明顯大於建立或撤消執行緒時的開銷。+++
程序間的通訊方式:
(1).管道(pipe)及有名管道(named pipe):
管道可用於具有親緣關係的父子程序間的通訊,有名管道除了具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。
(2).訊號(signal):
訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收到乙個訊號與處理器收到乙個中斷請求效果上可以說是一致的。
(3).訊息佇列(message queue):
訊息佇列是訊息的鏈結表,它克服了上兩種通訊方式中訊號量有限的缺點,具有寫許可權得程序可以按照一定得規則向訊息佇列中新增新資訊;對訊息佇列有讀許可權得程序則可以從訊息佇列中讀取資訊。
(4).共享記憶體(shared memory):
可以說這是最有用的程序間通訊方式。它使得多個程序可以訪問同一塊記憶體空間,不同程序可以及時看到對方程序中對共享記憶體中資料得更新。這種方式需要依靠某種同步操作,如互斥鎖和訊號量等。
(5).訊號量(semaphore):
主要作為程序之間及同一種程序的不同執行緒之間得同步和互斥手段。
(6).套接字(socket);
這是一種更為常用的程序間通訊機制,它可用於網路中不同機器之間的程序間通訊,應用非常廣泛。
一般我最常用的就是socket,共享記憶體用過,的確很方便,很效率,但是不能跨越物理機,用於伺服器的架構的話不能跨越物理機,承載就形成了瓶頸。其他的我都沒用過,
執行緒之間的同步通訊:
(1).訊號量
(2).訊息佇列
(3).事件event
4.同步和互斥的區別:
當 有多個執行緒的時候,經常需要去同步這些執行緒以訪問同乙個資料或資源。例如,假設有乙個程式,其中乙個執行緒用於把檔案讀到記憶體,而另乙個執行緒用於統計檔案中 的字元數。當然,在把整個檔案調入記憶體之前,統計它的計數是沒有意義的。但是,由於每個操作都有自己的執行緒,作業系統會把兩個執行緒當作是互不相干的任務分 別執行,這樣就可能在沒有把整個檔案裝入記憶體時統計字數。為解決此問題,你必須使兩個執行緒同步工作。
所 謂互斥,是指散布在不同程序之間的若干程式片斷,當某個程序執行其中乙個程式片段時,其它程序就不能執行它們之中的任一程式片段,只能等到該程序執行完這 個程式片段後才可以執行。如果用對資源的訪問來定義的話,互斥某一資源同時只允許乙個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資 源的訪問順序,即訪問是無序的
所謂同步,是指散步在不同程序之間的若干程式片斷,它們的執行必須嚴格按照規定的某種先後次序來執行,這種先後次序依賴於要完成的特定的任務。如果用對資源的訪問來定義的話,同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源
我個人理解:有乙個門,如果我進去不出來,其他人不能進,這是互斥;任何人任何時候都能進出,這就是同步。
5.類和結構體的區別
在c++中,類中定義的成員變數或成員函式預設都是private屬性的,而struct的成員變數或成員函式預設都是public屬性的。
(1).結構體(sturct)是一種值型別,而類(class)是引用型別。區別在於複製方式,值型別的資料是值賦值,引用型別的資料是引用複製。
(2).結構體使用棧儲存(stack allocation),而類使用堆儲存(heap allocation)。
如何選擇結構體還是類
(1).堆疊的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些
(2).結構體表示如點、矩形和顏色這樣的輕量物件,例如,如果宣告乙個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構體的成本較低。
(3).在表現抽象和多級別的物件層次時,類是最好的選擇,因為結構體不支援繼承
(4).大多數情況下該型別只是一些資料時,結構體時最佳的選擇
(5).在模板定義中,只能用class 或者typename 而不能用struct
我個人理解吧,如果類是程序,那麼結構體就是執行緒。實際應用就是,我們建立乙個物件用類,物件的各種屬性用結構體.
面試攻略 C 面試高階 資深篇
c 二面技術面試 2020 10 27技術面問題 1.自我介紹 2.說說伺服器架構 3.資料結構棧特性,棧的應用,棧為什麼會溢位 4.c 與c 的區別 5.c 是自動管理記憶體的,如果記憶體出了問題要怎麼解決 6.怎麼解決c 的空指標,野指標問題 7.你做過哪些伺服器效能優化 8.伺服器崩潰怎麼查錯...
面試攻略 C 面試 IGG
2020 11 14 igg主程式面試 能記起的部分 1.自我介紹 2.專案架構 3.跨程序玩家互動問題 4.記憶體池 5.頂號的問題 6.c 11 7.lua熱更 8.c 和lua互動 9.lua怎麼實現禁止修改表 10.c 怎麼實現禁止某些資料被拷貝 11.lua怎麼禁止申明全域性變數 12.l...
面試題 C 基礎篇(補充)
1 定義乙個常量,可以很方便地進行引數的調整和修改。const物件一旦建立後其值不能被修改,所以const物件必須初始化。2 const 變數相對於巨集定義更安全。編譯器可以對const變數進行型別安全檢查,而對巨集定義只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤。3 ...