版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频谷歌c面试题及答案智能指针的核心区别与循环引用解决unique_ptr通过独占所有权管理资源,其拷贝构造函数和赋值运算符被显式删除,仅支持移动语义转移所有权。默认使用delete释放资源,但可自定义删除器(如管理文件描述符时用close)。适用于资源生命周期明确归属单一对象的场景,例如函数内部动态分配的临时对象,用unique_ptr可避免手动释放。shared_ptr基于引用计数实现共享所有权,多个指针共享资源时,引用计数递增;任一指针销毁时计数递减,计数归零则释放资源。支持自定义删除器(如释放数组用delete[]),适用于资源需被多个模块共享的场景(如全局配置对象)。但需警惕循环引用:若对象A持有指向对象B的shared_ptr,对象B同时持有指向A的shared_ptr,两者引用计数无法归零,导致资源泄漏。weak_ptr是弱引用指针,不参与引用计数,仅观察shared_ptr管理的资源。通过lock()方法可获取shared_ptr(若资源未释放),用于打破循环引用。例如,父类用shared_ptr管理子类,子类用weak_ptr指向父类,父类销毁时子类引用计数归零,资源正常释放。虚函数表的实现与多继承场景含虚函数的类会提供虚函数表(vtable),存储虚函数地址的数组。对象内存首地址为虚表指针(vptr),指向类对应的vtable。构造对象时,构造函数初始化vptr指向本类vtable。单继承中,派生类vtable覆盖基类被重写的虚函数,新增虚函数添加在表尾。例如,基类有funcA()、funcB(),派生类重写funcA()并新增funcC(),则派生类vtable中funcA()指向派生类实现,funcB()保留基类实现,funcC()位于表尾。多继承时,派生类为每个基类提供独立vtable。对象内存包含多个vptr(按继承顺序排列)。如类D继承A和B(均含虚函数),D对象布局为:A的vptr、A成员、B的vptr、B成员、D成员。通过基类指针调用虚函数时,编译器调整指针偏移至对应基类子对象位置,再通过vptr访问vtable。汇编层面,虚函数调用流程为:从对象地址取vptr(如movrax,[rdi],rdi为对象指针),从vptr取虚函数地址(如movrax,[rax+8],8为函数偏移),最终调用该地址(callrax)。多继承时需先调整指针(如addrdi,offset_of_B_in_D),再执行上述步骤。移动语义与右值引用的实践C++11引入右值引用(T&&),区分左值(可取地址的表达式)和右值(临时对象、字面量)。移动语义通过移动构造函数和移动赋值运算符,将资源从右值对象转移至新对象,避免深拷贝。例如,vector的移动构造函数直接复制内部指针,原vector置空,时间复杂度O(1),而拷贝构造需O(n)复制元素。std::move将左值转换为右值引用,触发移动操作。需注意std::move不移动任何数据,仅标记对象可被移动。移动构造函数需确保原对象处于有效但未定义状态(如string移动后为空字符串)。优化场景:函数返回局部对象时,编译器自动应用RVO(返回值优化)或NRVO(命名返回值优化),直接构造目标对象,避免拷贝。若无法优化(如返回条件分支中的不同对象),移动语义可将局部对象移动至目标,提升性能。线程安全队列的实现使用std::mutex和std::condition_variable实现阻塞队列:```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();}};```关键点:push时若队列满,cv_push等待;pop时若队列空,cv_pop等待。使用std::unique_lock允许条件变量等待时解锁,唤醒后重新加锁。notify_one唤醒一个等待线程,避免惊群效应。无锁队列可通过CAS(Compare-And-Swap)实现,利用原子操作保证线程安全。例如,使用原子指针指向队列头尾,插入/删除时通过CAS更新指针,需处理ABA问题(通过版本号解决)。STL容器的选择与优化vector基于连续内存存储,支持O(1)随机访问,扩容时重新分配内存并复制元素(扩容因子通常为2,减少扩容次数)。优化建议:预先reserve足够空间避免多次扩容;使用emplace_back替代push_back,直接构造元素避免临时对象拷贝。unordered_map基于哈希表,平均O(1)查找,需处理哈希冲突(开放寻址法或链地址法)。选择场景:需快速查找且键值无顺序要求时使用;若键值需有序(如遍历按顺序),则选map(基于红黑树,O(logn)查找)。emplace与insert的区别:emplace通过参数直接构造元素,避免临时对象创建。例如,插入pair<int,string>时,insert需构造临时pair再复制,emplace直接传递int和string参数构造,效率更高。C++20协程的异步应用C++20协程通过co_await、co_yield、co_return关键字实现,将异步代码写为同步风格。协程挂起时保存上下文(寄存器、局部变量),唤醒时恢复,避免线程阻塞。示例:用协程实现异步文件读取:```cppinclude<coroutine>include<future>include<iostream>structFileReadAwaiter{intfd;charbuffer;size_tsize;boolawait_ready()constnoexcept{returnfalse;}voidawait_suspend(std::coroutine_handle<>h)noexcept{//注册异步读回调,完成后调用h.resume()async_read(fd,buffer,size,[h](){h.resume();});}size_tawait_resume()constnoexcept{returnget_read_result();//获取实际读取字节数}};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";```协程优势:减少线程切换开销,提升异步IO吞吐量;代码结构更清晰,避免回调地狱。constexpr的编译时计算演进C++11中constexpr限制较多(函数体仅能包含return语句,变量需初始化且用常量表达式),用于编译时计算简单值(如阶乘)。C++14允许函数体包含更多语句(循环、条件判断),C++20进一步支持constexprnew/delete、虚函数调用(在constexpr上下文中)、范围for循环等。示例:C++20constexpr计算斐波那契数列:```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);//编译时计算为55```应用场景:编译时配置校验(如数组大小、哈希值预计算)、元编程(提供类型或值),减少运行时计算开销。内存泄漏检测与自定义分配器内存泄漏常见场景:原始指针new后未delete、shared_ptr循环引用、异常导致析构函数未调用。检测工具:Valgrind(动态分析)、AddressSanitizer(编译时插桩)、VisualStudio的_CrtDumpMemoryLeaks。自定义分配器用于优化内存管理(如对象池减少malloc调用)。示例:```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可预分配大块内存,用链表管理空闲块,分配/释放时直接操作链表,效率高于标准分配器。模板元编程与类型特征std::type_traits提供编译时类型信息查询(如std::is_integral判断是否为整数类型)。结合std::enable_if可实现模板函数重载。示例:根据类型选择不同处理逻辑:```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";}```当传入int时调用第一个重载,传入double时调用第二个。异常安全与noexcept实践异常安全三级别:基本保证:操作失败后对象处于有效状态(无资源泄漏,数据未破坏)。强保证:操作失败后对象状态与操作前一致(“全或无”)。不抛异常保证:操作绝对不抛出异常(如移动构造函数标记为noexcept)。noexcept说明符声明函数不会抛出异常,编译器可优化(如不提供异常展开代码)。移动构造函数应标记noexcept,以便STL容器(如vector)在扩容时优先使用移动而非拷贝。单例模式的线程安全实现C++11起,局部静态变量初始化是线程安全的(编译器提供代码保证仅初始化一次),推荐实现:```cppclassSingleton{Singleton()=default;public:Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;staticSingleton&get(){staticSingletoninstance;returninstance;}};```双重检查锁定(DCLP)需注意内存可见性问题,C++11前可能因指令重排导致未初始化的实例被访问。C++11后使用std::atomic保证可见性,实现如下:```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与回调机制std::function封装可调用对象(函数、lambda、成员函数),实现类型擦除。结合std::bind可绑定参数或对象实例。示例:```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等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62541-11:2025 FR OPC Unified Architecture - Part 11: Historical Access
- 【正版授权】 IEC 60034-30-1:2025 FR Rotating electrical machines - Part 30-1: Efficiency classes of line operated AC motors (IE code)
- 【正版授权】 IEC 62037-2:2021/AMD1:2025 EN-FR Amendment 1 - Passive RF and microwave devices,intermodulation level measurement - Part 2: Measurement of passive intermodulation in coaxia
- 2025年中职第一学年(水文与水资源勘测)水文测验试题及答案
- 蓝风数据内容版式合集
- 总复习 第1课时 数与代数(一)(教学课件)-北师大版
- 工程桩施工培训课件
- 工程施工消防安全培训课件
- 工程建筑财务培训课件
- 制图基础知识课件
- 渤海银行公司业务部客户经理岗位技能竞赛题库含答案
- 2025年海洋平台维护五年优化报告
- 聚合码商户协议书
- 珠海高新区2025年下半年公开招聘公办中学事业编制教师备考题库及答案详解一套
- 2025年贵港市利恒投资集团有限公司公开招聘工作人员的备考题库及参考答案详解
- 辽宁省沈阳市皇姑区2024-2025学年七年级上学期期末道德与法治试卷
- 辽宁省盘锦市兴隆台区2024-2025学年九年级上学期期末数学试题
- 2026年企业所得税汇算清缴流程与申报技巧手册
- 2026年江西交通职业技术学院单招职业技能考试题库完美版
- 桥下空间施工方案
- 陪诊押金协议书
评论
0/150
提交评论