分享中望軟件 C/C++ 開發(fā)面經(jīng)
可能有的內(nèi)容答得不完善不正確,請(qǐng)大家注意甄別。
一面(9.15 45min)
1. ? ?自我介紹,項(xiàng)目經(jīng)歷偏通信,研究方向?為什么希望做軟件?(面試官問得比我寫得更尖銳。我是無線網(wǎng)絡(luò)和通信方向的學(xué)碩,日常學(xué)習(xí)和研究以實(shí)驗(yàn)+發(fā)論文為主,所以面試官問我為什么平時(shí)做通信,想做軟件開發(fā)。第一個(gè)問題就讓我感覺不太舒服,各位的研究方向五花八門,上來就 PUA 項(xiàng)目。簡歷和自我介紹了雙 985 七年科班軟件工程,不找軟件難道去賣煎餅果子?)
2. ? ?對(duì)我們公司了解嗎?CAD 用過嗎?猜測(cè)一下我們的 CAD 軟件產(chǎn)品使用了什么技術(shù)。(面試前特意去了解了一下他們公司,中國圖形建模龍頭企業(yè),簡單吹捧了一下。沒用過。全程尬聊,說了說 C++ 客戶端開發(fā)可能用到的計(jì)數(shù),還有圖形渲染技術(shù))
3. ? ?哪個(gè)項(xiàng)目用到比較深的技術(shù),接觸設(shè)計(jì)模式了嗎?(沒有什么比較深的技術(shù),說了多線程并發(fā))
4.????還了解什么設(shè)計(jì)模式?
5.????智能指針?使用的時(shí)候要注意什么?(四種智能指針 auto_ptr(已棄用),unique_ptr,shared_ptr,weak_ptr,早期的 auto_ptr 和之后的 unique_ptr 是為了實(shí)現(xiàn)對(duì)某一堆中對(duì)象的唯一管理,但當(dāng)移交管理的時(shí)候 auto_ptr 采取的是拷貝語義,unique_ptr 采用的是移動(dòng)語義,使得后者通用性更好;shared_ptr 采取引用計(jì)數(shù)思路管理對(duì)象生命周期,當(dāng)多一個(gè)指向該對(duì)象的 shared_ptr,引用計(jì)數(shù)加一,相反減一,引用計(jì)數(shù)為 0 時(shí),釋放被指向的內(nèi)存空間;weak_ptr 是為了解決 shared_ptr 強(qiáng)指向可能出現(xiàn)的循環(huán)引用導(dǎo)致的內(nèi)存泄漏,和當(dāng)被指向的對(duì)象被釋放產(chǎn)生的懸垂指針。使用時(shí)需要注意盡量不要直接使用智能指針的裸指針;在初始化只能指針的使用盡量使用 make_shared 和 make_unique 方法,一來可以加快初始化只能指針的速度(少編譯一次),二來可以避免因賦值初始化操作執(zhí)行一半造成的內(nèi)存泄漏;使用 shared_ptr 要注意是否會(huì)產(chǎn)生循環(huán)引用。)
7. ? ?weak_ptr 除了你說的這兩個(gè)作用(避免循環(huán)引用和懸垂指針)還有什么用途?weak_ptr 可以放在 STL?容器中嗎?(不會(huì))
8. ? ?make_shared 和 make_unique 都是哪個(gè)版本的 C++ 引入的?(make_shared 是 C++ 11;make_unique 是 C++ 14)
9.????右值引用,作用?(右值引用是 C++ 11 引入的特性,為了解決拷貝語義帶來的對(duì)對(duì)象傳遞帶來的開銷(以值傳遞的方式返回某一個(gè)對(duì)象,在 vs 編譯器中需要調(diào)用一次拷貝構(gòu)造函數(shù),用臨時(shí)變量保存返回出來的對(duì)象的值,然后再把這個(gè)對(duì)象的值的臨時(shí)變量拷貝給彈棧后的父域函數(shù)中的接收該函數(shù)返回值的對(duì)象變量中,因?yàn)闊o法管理右值的生命周期導(dǎo)致的無用開銷),用右值引用可以延長右值的生命周期,用移動(dòng)語義解決值傳遞問題,可以避免無用的拷貝開銷)
10 ? 除了這個(gè)左右還有什么作用呢?(不會(huì))
11.??進(jìn)程、線程間通信及同步的方法有什么?(進(jìn)程通信:匿名管道,有名管道,消息隊(duì)列,共享內(nèi)存,信號(hào)量,信號(hào),套接字;線程通信:共享進(jìn)程的全局變量,信號(hào)量,消息傳遞(OC 中的 GCD 等);進(jìn)程同步:信號(hào)量,管程,消息傳遞;線程同步:信號(hào)量,互斥鎖,條件變量等)
12 ? 進(jìn)程間通信最快的是什么?(共享內(nèi)存)第二快的呢?(不會(huì))
13. ?鎖了解哪些(按加鎖策略分:樂觀鎖:假定在訪問過程中不會(huì)發(fā)生修改,訪問后再判斷版本號(hào),查看是否在訪問期間修改了(Git,共享文檔常用;效率高,但對(duì)高并發(fā)效果差)、悲觀鎖:認(rèn)為訪問過程中會(huì)被修改,所以訪問前就加鎖(讀寫鎖就是一類悲觀鎖);按等待方式分:阻塞鎖(阻塞未能獲取到資源的進(jìn)程,不再分配時(shí)間片,資源被釋放時(shí)喚醒該進(jìn)程,有上下文切換開銷,適合大尺度時(shí)間調(diào)度)、自旋鎖(讓進(jìn)程忙等,繼續(xù)分配時(shí)間片,無上下文切換,但因?yàn)榉峙鋾r(shí)間片忙等有開銷,適合小尺度時(shí)間調(diào)度);按加鎖意圖分:讀鎖(共享鎖,S鎖):加讀鎖的資源還可以被想加讀鎖的進(jìn)程獲取,不能被想加寫鎖的進(jìn)程獲取、寫鎖(獨(dú)占鎖,X鎖):加寫鎖):加寫鎖的資源不能被想加讀鎖的進(jìn)程獲取,也不能被想加寫鎖的進(jìn)程獲取;數(shù)據(jù)庫中的鎖(庫級(jí)鎖、表級(jí)鎖(表結(jié)構(gòu)鎖,讀寫意向鎖,表讀寫鎖)、行級(jí)鎖(行鎖(讀寫鎖),記錄鎖(讀寫鎖),間隙鎖(GAP 鎖:鎖區(qū)間、插入意向鎖;鎖點(diǎn))):為實(shí)現(xiàn)數(shù)據(jù)庫系統(tǒng)的隔離性)
10. ?C++ 11 thread 庫中的 join 和 detach 的區(qū)別(join 是讓父線程運(yùn)行到 childthread.join() 處時(shí),等待子線程的結(jié)束,并回收子線程資源,可以保證父線程不會(huì)在子線程結(jié)束之間結(jié)束;detach 是讓該子線程與其父線程拆離父子關(guān)系,使子線程變成守護(hù)線程,與程序的主線程擁有相同的生命周期,結(jié)束時(shí)原子線程自己回收資源)
11.??職業(yè)規(guī)劃和對(duì)加班的想法
二面(10.16 約面,已拒)
面試體驗(yàn)不是很良好,面試官考察很深入,對(duì)校招面試者要求很高,需要具有入職就能工作的能力。