2025年高頻谷歌c面試題及答案_第1頁
2025年高頻谷歌c面試題及答案_第2頁
2025年高頻谷歌c面試題及答案_第3頁
2025年高頻谷歌c面試題及答案_第4頁
2025年高頻谷歌c面試題及答案_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

2025年高頻谷歌c面試題及答案智能指針的核心區(qū)別與循環(huán)引用解決unique_ptr通過獨(dú)占所有權(quán)管理資源,其拷貝構(gòu)造函數(shù)和賦值運(yùn)算符被顯式刪除,僅支持移動(dòng)語義轉(zhuǎn)移所有權(quán)。默認(rèn)使用delete釋放資源,但可自定義刪除器(如管理文件描述符時(shí)用close)。適用于資源生命周期明確歸屬單一對(duì)象的場(chǎng)景,例如函數(shù)內(nèi)部動(dòng)態(tài)分配的臨時(shí)對(duì)象,用unique_ptr可避免手動(dòng)釋放。shared_ptr基于引用計(jì)數(shù)實(shí)現(xiàn)共享所有權(quán),多個(gè)指針共享資源時(shí),引用計(jì)數(shù)遞增;任一指針銷毀時(shí)計(jì)數(shù)遞減,計(jì)數(shù)歸零則釋放資源。支持自定義刪除器(如釋放數(shù)組用delete[]),適用于資源需被多個(gè)模塊共享的場(chǎng)景(如全局配置對(duì)象)。但需警惕循環(huán)引用:若對(duì)象A持有指向?qū)ο驜的shared_ptr,對(duì)象B同時(shí)持有指向A的shared_ptr,兩者引用計(jì)數(shù)無法歸零,導(dǎo)致資源泄漏。weak_ptr是弱引用指針,不參與引用計(jì)數(shù),僅觀察shared_ptr管理的資源。通過lock()方法可獲取shared_ptr(若資源未釋放),用于打破循環(huán)引用。例如,父類用shared_ptr管理子類,子類用weak_ptr指向父類,父類銷毀時(shí)子類引用計(jì)數(shù)歸零,資源正常釋放。虛函數(shù)表的實(shí)現(xiàn)與多繼承場(chǎng)景含虛函數(shù)的類會(huì)提供虛函數(shù)表(vtable),存儲(chǔ)虛函數(shù)地址的數(shù)組。對(duì)象內(nèi)存首地址為虛表指針(vptr),指向類對(duì)應(yīng)的vtable。構(gòu)造對(duì)象時(shí),構(gòu)造函數(shù)初始化vptr指向本類vtable。單繼承中,派生類vtable覆蓋基類被重寫的虛函數(shù),新增虛函數(shù)添加在表尾。例如,基類有funcA()、funcB(),派生類重寫funcA()并新增funcC(),則派生類vtable中funcA()指向派生類實(shí)現(xiàn),funcB()保留基類實(shí)現(xiàn),funcC()位于表尾。多繼承時(shí),派生類為每個(gè)基類提供獨(dú)立vtable。對(duì)象內(nèi)存包含多個(gè)vptr(按繼承順序排列)。如類D繼承A和B(均含虛函數(shù)),D對(duì)象布局為:A的vptr、A成員、B的vptr、B成員、D成員。通過基類指針調(diào)用虛函數(shù)時(shí),編譯器調(diào)整指針偏移至對(duì)應(yīng)基類子對(duì)象位置,再通過vptr訪問vtable。匯編層面,虛函數(shù)調(diào)用流程為:從對(duì)象地址取vptr(如movrax,[rdi],rdi為對(duì)象指針),從vptr取虛函數(shù)地址(如movrax,[rax+8],8為函數(shù)偏移),最終調(diào)用該地址(callrax)。多繼承時(shí)需先調(diào)整指針(如addrdi,offset_of_B_in_D),再執(zhí)行上述步驟。移動(dòng)語義與右值引用的實(shí)踐C++11引入右值引用(T&&),區(qū)分左值(可取地址的表達(dá)式)和右值(臨時(shí)對(duì)象、字面量)。移動(dòng)語義通過移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符,將資源從右值對(duì)象轉(zhuǎn)移至新對(duì)象,避免深拷貝。例如,vector的移動(dòng)構(gòu)造函數(shù)直接復(fù)制內(nèi)部指針,原vector置空,時(shí)間復(fù)雜度O(1),而拷貝構(gòu)造需O(n)復(fù)制元素。std::move將左值轉(zhuǎn)換為右值引用,觸發(fā)移動(dòng)操作。需注意std::move不移動(dòng)任何數(shù)據(jù),僅標(biāo)記對(duì)象可被移動(dòng)。移動(dòng)構(gòu)造函數(shù)需確保原對(duì)象處于有效但未定義狀態(tài)(如string移動(dòng)后為空字符串)。優(yōu)化場(chǎng)景:函數(shù)返回局部對(duì)象時(shí),編譯器自動(dòng)應(yīng)用RVO(返回值優(yōu)化)或NRVO(命名返回值優(yōu)化),直接構(gòu)造目標(biāo)對(duì)象,避免拷貝。若無法優(yōu)化(如返回條件分支中的不同對(duì)象),移動(dòng)語義可將局部對(duì)象移動(dòng)至目標(biāo),提升性能。線程安全隊(duì)列的實(shí)現(xiàn)使用std::mutex和std::condition_variable實(shí)現(xiàn)阻塞隊(duì)列:```cppinclude<queue>include<mutex>include<condition_variable>template<typenameT>classThreadSafeQueue{std::queue<T>q;mutablestd::mutexm;std::condition_variablecv_push,cv_pop;size_tmax_size;public:explicitThreadSafeQueue(size_tsize=10):max_size(size){}voidpush(Tval){std::unique_lock<std::mutex>lock(m);cv_push.wait(lock,[this]{returnq.size()<max_size;});q.push(std::move(val));cv_pop.notify_one();}booltry_pop(T&val){std::lock_guard<std::mutex>lock(m);if(q.empty())returnfalse;val=std::move(q.front());q.pop();cv_push.notify_one();returntrue;}voidwait_pop(T&val){std::unique_lock<std::mutex>lock(m);cv_pop.wait(lock,[this]{return!q.empty();});val=std::move(q.front());q.pop();cv_push.notify_one();}boolempty()const{std::lock_guard<std::mutex>lock(m);returnq.empty();}};```關(guān)鍵點(diǎn):push時(shí)若隊(duì)列滿,cv_push等待;pop時(shí)若隊(duì)列空,cv_pop等待。使用std::unique_lock允許條件變量等待時(shí)解鎖,喚醒后重新加鎖。notify_one喚醒一個(gè)等待線程,避免驚群效應(yīng)。無鎖隊(duì)列可通過CAS(Compare-And-Swap)實(shí)現(xiàn),利用原子操作保證線程安全。例如,使用原子指針指向隊(duì)列頭尾,插入/刪除時(shí)通過CAS更新指針,需處理ABA問題(通過版本號(hào)解決)。STL容器的選擇與優(yōu)化vector基于連續(xù)內(nèi)存存儲(chǔ),支持O(1)隨機(jī)訪問,擴(kuò)容時(shí)重新分配內(nèi)存并復(fù)制元素(擴(kuò)容因子通常為2,減少擴(kuò)容次數(shù))。優(yōu)化建議:預(yù)先reserve足夠空間避免多次擴(kuò)容;使用emplace_back替代push_back,直接構(gòu)造元素避免臨時(shí)對(duì)象拷貝。unordered_map基于哈希表,平均O(1)查找,需處理哈希沖突(開放尋址法或鏈地址法)。選擇場(chǎng)景:需快速查找且鍵值無順序要求時(shí)使用;若鍵值需有序(如遍歷按順序),則選map(基于紅黑樹,O(logn)查找)。emplace與insert的區(qū)別:emplace通過參數(shù)直接構(gòu)造元素,避免臨時(shí)對(duì)象創(chuàng)建。例如,插入pair<int,string>時(shí),insert需構(gòu)造臨時(shí)pair再復(fù)制,emplace直接傳遞int和string參數(shù)構(gòu)造,效率更高。C++20協(xié)程的異步應(yīng)用C++20協(xié)程通過co_await、co_yield、co_return關(guān)鍵字實(shí)現(xiàn),將異步代碼寫為同步風(fēng)格。協(xié)程掛起時(shí)保存上下文(寄存器、局部變量),喚醒時(shí)恢復(fù),避免線程阻塞。示例:用協(xié)程實(shí)現(xiàn)異步文件讀?。篳``cppinclude<coroutine>include<future>include<iostream>structFileReadAwaiter{intfd;charbuffer;size_tsize;boolawait_ready()constnoexcept{returnfalse;}voidawait_suspend(std::coroutine_handle<>h)noexcept{//注冊(cè)異步讀回調(diào),完成后調(diào)用h.resume()async_read(fd,buffer,size,[h](){h.resume();});}size_tawait_resume()constnoexcept{returnget_read_result();//獲取實(shí)際讀取字節(jié)數(shù)}};std::future<size_t>read_file(intfd,charbuffer,size_tsize){co_returnco_awaitFileReadAwaiter{fd,buffer,size};}//使用autof=read_file(0,buf,1024);f.wait();std::cout<<"Read"<<f.get()<<"bytes\n";```協(xié)程優(yōu)勢(shì):減少線程切換開銷,提升異步IO吞吐量;代碼結(jié)構(gòu)更清晰,避免回調(diào)地獄。constexpr的編譯時(shí)計(jì)算演進(jìn)C++11中constexpr限制較多(函數(shù)體僅能包含return語句,變量需初始化且用常量表達(dá)式),用于編譯時(shí)計(jì)算簡單值(如階乘)。C++14允許函數(shù)體包含更多語句(循環(huán)、條件判斷),C++20進(jìn)一步支持constexprnew/delete、虛函數(shù)調(diào)用(在constexpr上下文中)、范圍for循環(huán)等。示例:C++20constexpr計(jì)算斐波那契數(shù)列:```cppconstexprintfib(intn){if(n<=1)returnn;inta=0,b=1;for(inti=2;i<=n;++i){intc=a+b;a=b;b=c;}returnb;}constexprintval=fib(10);//編譯時(shí)計(jì)算為55```應(yīng)用場(chǎng)景:編譯時(shí)配置校驗(yàn)(如數(shù)組大小、哈希值預(yù)計(jì)算)、元編程(提供類型或值),減少運(yùn)行時(shí)計(jì)算開銷。內(nèi)存泄漏檢測(cè)與自定義分配器內(nèi)存泄漏常見場(chǎng)景:原始指針new后未delete、shared_ptr循環(huán)引用、異常導(dǎo)致析構(gòu)函數(shù)未調(diào)用。檢測(cè)工具:Valgrind(動(dòng)態(tài)分析)、AddressSanitizer(編譯時(shí)插樁)、VisualStudio的_CrtDumpMemoryLeaks。自定義分配器用于優(yōu)化內(nèi)存管理(如對(duì)象池減少malloc調(diào)用)。示例:```cpptemplate<typenameT>structPoolAllocator{usingvalue_type=T;PoolAllocator()=default;template<typenameU>PoolAllocator(constPoolAllocator<U>&){}Tallocate(size_tn){returnstatic_cast<T>(MemoryPool::get().allocate(nsizeof(T)));}voiddeallocate(Tp,size_tn){MemoryPool::get().deallocate(p,nsizeof(T));}};//使用std::vector<int,PoolAllocator<int>>vec;```MemoryPool可預(yù)分配大塊內(nèi)存,用鏈表管理空閑塊,分配/釋放時(shí)直接操作鏈表,效率高于標(biāo)準(zhǔn)分配器。模板元編程與類型特征std::type_traits提供編譯時(shí)類型信息查詢(如std::is_integral判斷是否為整數(shù)類型)。結(jié)合std::enable_if可實(shí)現(xiàn)模板函數(shù)重載。示例:根據(jù)類型選擇不同處理邏輯:```cpptemplate<typenameT,typename=std::enable_if_t<std::is_integral_v<T>>>voidprocess(Tval){std::cout<<"Integral:"<<val<<"\n";}template<typenameT,typename=std::enable_if_t<std::is_floating_point_v<T>>>voidprocess(Tval){std::cout<<"Floating:"<<val<<"\n";}```當(dāng)傳入int時(shí)調(diào)用第一個(gè)重載,傳入double時(shí)調(diào)用第二個(gè)。異常安全與noexcept實(shí)踐異常安全三級(jí)別:基本保證:操作失敗后對(duì)象處于有效狀態(tài)(無資源泄漏,數(shù)據(jù)未破壞)。強(qiáng)保證:操作失敗后對(duì)象狀態(tài)與操作前一致(“全或無”)。不拋異常保證:操作絕對(duì)不拋出異常(如移動(dòng)構(gòu)造函數(shù)標(biāo)記為noexcept)。noexcept說明符聲明函數(shù)不會(huì)拋出異常,編譯器可優(yōu)化(如不提供異常展開代碼)。移動(dòng)構(gòu)造函數(shù)應(yīng)標(biāo)記noexcept,以便STL容器(如vector)在擴(kuò)容時(shí)優(yōu)先使用移動(dòng)而非拷貝。單例模式的線程安全實(shí)現(xiàn)C++11起,局部靜態(tài)變量初始化是線程安全的(編譯器提供代碼保證僅初始化一次),推薦實(shí)現(xiàn):```cppclassSingleton{Singleton()=default;public:Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;staticSingleton&get(){staticSingletoninstance;returninstance;}};```雙重檢查鎖定(DCLP)需注意內(nèi)存可見性問題,C++11前可能因指令重排導(dǎo)致未初始化的實(shí)例被訪問。C++11后使用std::atomic保證可見性,實(shí)現(xiàn)如下:```cppclassSingleton{staticstd::atomic<Singleton>instance;staticstd::mutexm;Singleton()=default;public:staticSingleton&get(){Singletonptr=instance.load(std::memory_order_acquire);if(!ptr){std::lock_guard<std::mutex>lock(m);ptr=instance.load(std::memory_order_relaxed);if(!ptr){ptr=newSingleton();instance.store(ptr,std::memory_order_release);}}returnptr;}};```std::function與回調(diào)機(jī)制std::function封裝可調(diào)用對(duì)象(函數(shù)、lambda、成員函數(shù)),實(shí)現(xiàn)類型擦除。結(jié)合std::bind可綁定參數(shù)或?qū)ο髮?shí)例。示例:```cppinclude<functional>include<iostream>classEventEmitter{std::vector<std::function<void(int)>>listeners;public:voidon(std::function<void(int)>cb){listeners.push_back(cb);}voidemit(intdata){for(auto&cb:listeners)cb(data);}};intmain(){EventEmitteremitter;emitter.on([](intx){std::cout<<"Event:"<<x<<"\n";});emitter.emit(42);//輸出"Event:42"return0;}```C+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論