2025年高频谷歌c面试题及答案.docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

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实现阻塞队列:

```cpp

includequeue

includemutex

includecondition_variable

templatetypenameT

classThreadSafeQueue{

std::queueTq;

mutablestd::mutexm;

std::condition_variablecv_push,cv_pop;

size_tmax_size;

public:

explicitThreadSafeQueue(size_tsize=10):max_size(size){}

voidpush(Tval){

std::unique_lockstd::mutexlock(m);

cv_push.wait(lock,[this]{returnq.size()max_size;});

q.push(std::move(val));

cv_pop.notify_one();

}

文档评论(0)

yclhdq + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档