Windows客户端开发面经(2021-03)

文章目录

  • 常见问题
  • 主要技术问题
    • c++相关问题
      • c++基础知识
      • STL
      • c++11/14/17/20 新特性
    • Windows相关问题
    • Qt/MFC相关问题
    • 软件架构相关问题
    • 性能优化相关问题
    • 调试技巧相关问题
    • Electron相关问题
    • 音视频相关问题
    • 网络编程相关问题
    • 个人项目相关问题
    • 编程题
    • 非技术类问题
    • 问技术官的问题

常见问题

  1. 辞职原因
    从自身职业规划和发展的方向说
  2. 期望薪资
  3. 项目遇到的难点
  4. 平时的学习方式
  5. 有什么想要问面试官的
    (1) 你们团队规模
    (2) 项目的定位或目标,目前所处的阶段
    (3) 项目后续的计划,可能遇到的挑战
    (4) 该岗位的角色定位,需要承担什么任务,还需要什么技能

主要技术问题

  1. 性能优化相关
  2. 进程间通信(参数序列化问题),多线程
  3. 调试技巧及工具的使用(windbg)
  4. 设计模式,软件架构
  5. STL及算法

c++相关问题

c++基础知识

  • c++的多态怎么实现的
  • 虚函数是怎么实现的呢
  • 函数重载的原理是什么,知道什么是c++命名改编吗?
  • 虚函数一般在什么场景使用?虚析构函数作用是什么?
  • 构造函数为什么不能声明成虚函数,多态时,析构函数为什么要声明成虚函数
  • 虚函数和纯虚函数的区别
  • 写一个c++函数支持多返回值,有哪些方法?
  • 传指针参数和传引用参数的区别,还有它们的使用场景
  • boost库用过吗?
  • 函数调用规约有哪些,它们的区别?
  • 模板与继承的区别?
  • main函数之前做了什么?
  • 一个结构体包含int,double,char变量,sizeof结构体是多少字节?
  • 堆和栈的区别
  • new/delete 和malloc/free的区别
  • static关键字
  • c++类对象的内存模型是怎么样的
  • 前置声明考察, 这段代码有什么问题吗
class Date;
class Test{
public:
    Date d;
}
  • c++的RAII机制,是什么意思呢
  • 类的赋值构造,拷贝构造和普通构造一般什么时候调用呢,用代码描述下
  • explicit关键字的作用
  • extern “C” 的作用
  • 四种cast函数
  • 下面这个场景代码,会有问题吗
// 这个是不会异常的,因为函数地址是根据对象的类类型去查找的,编译期就确定了它调用的地址
class A{
public:
    void func(){
        
    }
};
A* p = nullptr;
p->func();

// 如果类里面有成员变量,因为函数使用了成员变量,要传入this指针给函数,所以这个是会崩溃的
class A{
public:
    void func(){
        cout << i << endl;
    }
    int i;
};
A* p = nullptr;
p->func();

// 这个也是会崩溃的,因为这里要访问p对象的虚表指针
class A{
public:
    virtual void func(){
        
    }
}
A* p = nullptr;
p->func();

STL

  • map容器线程安全吗?查找效率是多少,为什么?
  • vector和list的区别,它们的迭代器,什么情况下会失效
  • 如何避免迭代器失效呢
  • STL里面的unordered_map和普通map有什么区别?unordered_map有什么缺点呢?
  • unordered_map底层的哈希表是怎么解决冲突的呢
  • 哈希表的初始大小是怎么确定的呢?是固定长度吗?
  • 红黑树的自平衡过程是怎么样的

c++11/14/17/20 新特性

  • 智能指针有哪些类型,实现原理是怎么样的,它们的使用场景分别是什么?
  • weak_ptr的实现原理是怎么样?
  • weak_ptr的lock()是怎么实现呢?
  • weak_ptr有什么限制吗,线程安全吗
  • vector容器存放shared_ptr和unique_ptr会有什么问题吗
  • std::future的get()是怎么实现的?
  • NULL和nullptr的区别,引入nullptr的目的?
  • c++20有哪些新特性?
  • 你了解右值吗,它有什么作用吗?用右值和不用右值,它在内存里面的表现有什么不同吗
  • 构造函数用公有和私有有什么不同吗?构造函数是私有的情况下,析构函数可以声明成公有吗?
  • lamaba匿名函数的原理是什么,你知道它的捕获原理吗
  • 智能指针考点,这段代码有什么问题吗?
int* x(new int(10));
shared_ptr sp1(x);
shared_ptr sp2(x);
  • c++ 98 和 c++11的区别,有哪些点让你觉得很好用的
  • c++ 11你还了解哪些新特性

Windows相关问题

  • Windows核心编程有看过?
  • Win32下,创建一个窗口的过程
  • 宽字符和窄字符转换你用过哪些函数?Qt有哪些呢?MFC呢?CString你有用过吗?在MFC或ATL里面字符串编码怎么转呢?WString用的多吗?
  • 说一下windows的消息机制吧
  • windows的消息循环体具体是怎么样的,比如用了哪些api?
  • CreateThread和__beginThread的区别?
  • 线程句柄能做同步吗,比如用WaitForSingleObject函数等待线程句柄变为已通知状态?窗口句柄能做线程同步吗?
  • 有没有了解过透明窗口,使用纯的windowsApi是怎么实现的呢?比如我要显示一个六边形的窗口,要怎么实现呢?
  • GDI的绘制你了解吗
  • 你了解DirectUI吗
  • 你了解几种内核对象呢?实际用过哪几个呢
  • 事件和互斥量的使用场景是怎么样的
  • sendmessage和postmessage的区别
  • 如果跨进程调用sendMessage,是怎么样的过程?
  • SendMessage和PostMessage函数的区别?如果让你设计SendMessage,要怎么实现?
  • getMessage和peekMessage的区别
  • 进程间的通信有哪几种,用过哪几种
  • 像访问NULL这个地址,为啥会崩溃呢
  • 操作系统为什么约定这个段不可访问呢,或者说有什么作用
  • 如果访问一个常规的地址,然后崩溃了,为什么呢(按我的理解是,因为内存地址是一个虚拟的地址,然后访问的地址没有映射到相应的物理地址,那么就会产生缺页异常等问题,可能会访问到不属于你的物理内存了)除了这个原因还有别的情况,或者写这地址崩溃是什么原因呢(可能是访问到只读内存段)那一般什么样的情况会设置成只读呢(一般是代码段,或者常量数据段)
  • 多线程之间,如何做通信呢?如何实现一个场景,定义一系列的消息,然后通知给另一个线程?在windows下面,还有更快捷的方式实现吗?
  • 你知道windows下面有哪些句柄吗
  • Windows的句柄底层是什么样结构
  • 窗口句柄能在进程间共享吗
  • Windows的怎么创建线程?
  • 临界区的实现原理知道吗(这个没有具体了解,临界区是用户态的)
  • trylock底层是怎么实现的
  • windows的刷新窗口机制?updateWindows()直接刷新是怎么实现的呢?
  • windows的共享内存是怎么实现的呢?
  • Windows的UAC机制是什么,对应用程序有什么影响
  • 内核对象和普通对象有什么区别
  • 访问内核对象有什么开销吗,比如通过系统调用访问一个文件句柄,中间有什么开销吗,运行期是在一个线程还是多个线程
  • 你知道windows的消息钩子吗?它能实现dll,然后注入到其他进程里面吗
  • 你在Windows这一块的技术深度在哪里

Qt/MFC相关问题

  • Qt或MFC是如何封装消息和处理对象的绑定
  • QProcess的底层实现是什么
  • Qt的界面布局,一般什么场景使用
  • 有用Qt做过一些比较复杂的动画界面吗?比如加速球,滚动翻页?
  • 边框阴影效果怎么实现?
  • Qt和MFC那个比较好,界面方面
  • MFC的消息映射机制是怎么实现的?
  • Qt的信号的参数和槽函数的参数不一致可以吗
  • Qt的信号槽是怎么实现的呢
  • 那你知道它的信号在底层是怎么样的,是字符串或者是一个整型
  • 假如要展示十万条数据在UI,有没有考虑怎么实现性能比较好呢?
  • Qt的控件有句柄吗
  • 可以在多线程里面操作UI的元素吗
  • Qt和MFC最大的不同是什么?
  • 简单说一下qt和mfc的区别
  • qt的事件驱动模型和windows的消息循环有什么区别?
  • qt的内存管理是怎么样
  • Qt的moc系统你了解吗
  • QString和std::string的区别?
  • Qt的多线程有哪些使用方式
  • Qt的show()和exec()的区别
  • QObject(QObject* parent = nullptr), 这个parent的作用是什么
  • UI双缓冲机制的实现原理
  • 有没有看过Qt开源协议吗
  • Qt的渲染机制是怎么样的呢
  • Qt应用程序下,点击一个按钮,到它的事件响应,中间的过程是怎么样的
  • Qt的信号槽有几种连接方式

软件架构相关问题

  • 架构设计的原则了解吗?
  • UML 组合和聚合的区别?
  • 组合和继承的区别和使用场景
  • 设计模式比较强调用组合还是继承
  • 客户端用了什么架构
  • mvvm的双向绑定是怎么实现的呢
  • 线程池一般在什么场景下使用呢
  • 线程池线程数怎么设置最好?
  • 向线程池投递阻塞任务,会不会异常?
  • 如何实现一个线程池?
  • 自己实现线程池要考虑哪些方面
  • 任务可变参数怎么实现呢
  • 有没有用过std::bind呢
  • 如何唤醒睡眠的线程?什么是虚假唤醒?
  • 线程同步有哪些方式?
  • 画一下你们的产品架构
  • 单例模式要注意哪些点?
  • 单例模式延时创建有什么好处和坏处?
  • 实现一个线程安全的单例
  • 观察者模式有用吗?一般在什么场景使用?
  • 设计模式中,有没有哪个设计模式让你的代码看起来非常酷炫,质量提升很大?有没有用过命令模式?
  • 多进程,A进程判断B进程在不在,怎么判断?
  • 多进程经常会有远程调用,传参需要序列化,Qt一般怎么做呢?
  • 读写锁怎么实现?
  • 一个进程的窗口显示另一个进程的窗口内容,怎么实现?
  • 假如有2TB的本地字符串数据,用一台只有2G内存的电脑对它排序,你有什么方案吗?其中主要消耗的性能在哪?假设IO的性能指标为吞吐量,计算下排序完成后总的吞吐量是多少?
  • 平时怎么使用动态库的?怎么做动态加载呢
  • 有考虑过面向接口的风格实现dll,就是通过导出一个接口对象,然后就访问对象的方法
  • 动态库里面的全局变量一般在什么时候销毁
  • 如何检测用户端的卡顿问题

性能优化相关问题

  • 了解哪些性能优化方法?
  • 性能优化用到哪些工具?
  • cpu占用高是用什么方法定位?
  • vld内存泄漏检测机制是怎么实现的?
  • 如何扩展vld,使它能够检测出数组越界,指针多次释放,或者野指针

调试技巧相关问题

  • 你解决crash问题的话,一般都是怎么解决的?你能举一个比较详细的例子吗
  • 崩溃问题如何处理,降下崩溃率?
  • 有没有碰到UI阻塞问题,如何处理?
  • windbg分析内存用什么指令?损坏的堆栈怎么重建?
  • windbg的栈回溯有做过吗?
  • windbg如何强制加载一个不匹配的pdb文件?
  • 遇到最难调试的问题?
  • 内存泄漏怎么定位?
  • vld收集到的泄漏信息会比较散乱,比如单例的内存分配,vld有可能无法检测到它的回收,这种情况要怎么排除单例的内存分配问题
  • 如果有句柄泄漏怎么定位呢?vld应该定位不到吧
  • 有没有调试过应用卡死的情况,调试步骤是怎么样的?主线程卡死一般是什么原因?怎么避免呢
  • 分享一个你解决问题的过程和思路?
  • dump是怎么产生的
  • dump有哪些类型,它们的区别是什么
  • 调试的时候,停在一个断点上,这时能看到它的调用栈,比如main->fun1->fun2->fun3->fun4,如果在后面接一段代码,然后跑完这段代码后,能不能把这个调用栈变成了main->fun1->fun2?
  • 如果线上有一个崩溃,只知道崩溃的代码段的地址,如果根据这个地址去定位崩溃的函数栈,可以实现吗
  • 崩溃收集的minidump,一般都会缺少一些内存数据,这个时候如果是内存错误问题,要怎么看呢
  • 多进程怎么调试呢
  • 开发过程中,如果想监控一个变量被改变时,中断下来,怎么做呢

Electron相关问题

  • Electron如何调用一个c++函数
  • electron和普通UI有什么优劣的地方
  • cef开发你了解过吗
  • Electron+vue是怎么考虑这个技术选型呢
  • electron的包是非常大的,你们是怎么对它进行裁剪的呢
  • electron跨平台是怎么做的呢
  • electron写了多久,你了解electron的架构是怎么样的
  • chromium和nodejs的消息循环是怎么协作的
  • Electron的架构是怎么样的
  • Electron的页面出现卡顿问题,怎么解决呢

音视频相关问题

  • 音视频里面,MP4和flv,如果大小相等的情况,那个视频质量好点
  • 你了解哪些音视频知识呢?视频帧有哪些类型?B帧是怎么算出来的
  • 视频编解码你了解多少

网络编程相关问题

  • get和post的使用场景
  • 网络层是你自己封装实现的吗?断线重连机制怎么实现的?怎么知道网络断线了?
  • socket实现进程间通信,具体流程是怎么样的呢
  • 服务端的socket流程是怎么样的,调用了哪些api
  • tcp怎么解决粘包问题
  • 字节序你了解吗
  • tcp的断线重连机制是怎么实现的呢?怎么知道它断线呢
  • TCP和UDP的区别
  • 你使用过winsock是吧,你简单说一下winsock怎么建立一个连接
  • Http协议定义的method有哪些?它定义这么多method的意义是什么呢?你知道RESTful吗?那Http的缓存原理你了解吗
  • 浏览器打开Https链接的具体过程是怎么样的?
  • tcp为什么要三次握手
  • 为什么选择用websocket做订阅,而不用http?
  • http3.0这些底层可能会改成udp,为什么要做这个改动

个人项目相关问题

  • 说一个比较体现你技术深度的项目吧
  • XXX是怎么样的场景下提出的
  • 当时是怎么设计这个XXX的架构?
  • 你的XXX各个模块间的通信是怎么样的

编程题

  • 实现atoi函数(要考虑正负号,还有大数问题,比如int溢出)
  • 用循环数组实现一个队列(其实就是环形队列的实现)
  • 多线程打印零、奇数、偶数
  • 实现一个观察者模式的场景代码
  • 算法题,两数之和
  • 写一个死锁的场景,然后怎么避免它死锁
  • 实现一个锁的自动管理类
  • 实现一个shared_ptr
  • 检测一个链表是否有环
  • 实现一个单词反转函数,比如输入"this is online interview", 输出"interview online is this"
  • 写一个单例类
  • 输入一个字符串,返回它的最长单一字符子串。如: 输入“aaabbbbcccccc”, 则输出“cccccc”
  • 设计一个任务队列,提供一个PostTask接口,用于异步执行任务;一个PostDelayTask接口,用于延迟异步执行

非技术类问题

  • 为什么辞职?
  • 平时的学习途径?
  • 你平时看开源代码吗?有看过chromium的代码吗?
  • 有了解一些第三方库吗?
  • 你还有看过别的比较有意思的开源项目吗?
  • 你对加班怎么看?
  • 你对编码有什么要求吗?
  • 个人有一个怎么样的职业规划呢
  • 近期有在学习什么技术吗

问技术官的问题

  • 产品的技术栈是怎么样的?
  • 假如说,如果有机会进去,还需要了解什么技能吗
  • 产品的目标和定位
  • 产品目前所处的阶段,遇到的技术挑战

你可能感兴趣的:(面试经历,面试,c++)