- 先聊一个你做的项目(问了项目模块 实现逻辑 技术要点)
- 项目的引申:设计模式(生产者消费者 监听者)
- 如何解决进程间同步问题?(给全局变量,和静态变量加锁,或者只有一个进程往其中写,其余让他们只读)
- 怎样看一个函数是不是线程安全的?(是否用到了全局或者静态变量,是否函数内部加锁了 或者只读)
- 遇到过内存泄漏吗,如何检测(mtrace,varglind,WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector) ),
- 如何避免?(使用智能指针,介绍智能指针,自己实现的auto_ptr)
- 不使用智能指针的话怎么做?(在程序中自己将指向堆内存的指针记录下来,在程序结束后查看是否一一释放?)
- 如何查看?(我可以自己定义一个结构体,里面包含一个void *指针 和 bool标志位,来记录这个指针是否释放了 内存)
- ///
- c++的项目做了很多 说一下 c++多态,(静多态:重载模板,动多态:继承 虚函数,细说概念 以及使用场景)
- 你提到了虚函数,虚函数跟纯虚函数的区别?
- 析构可以是虚的吗?
- 再说下 隐藏和覆盖的区别?
- 解释下 为什么要内存对齐 以及内存对其规则?(1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常 2.硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升 我只回答出第二个,面试官大概想提醒我 将问题引导了 平台上)
- 32位的机器 和64位的机器 进行通信 有什么要注意的地方( 类型字节数不同 比如long 防止在64位机器上 能表示的数据在32位机器上 溢出 或者 表示不准确。) 没回答好 参照他人完整回答
1.不能将指针转换成int、uint、long、ulong、dword等字长固定为32位的类型,如果需要对指针做运算,应把指针转换为int-ptr或uint-ptr,这两种类型在不同平台上才有正确的字长。另外,由于handle实质上是一个指针(void *),因此把handle转换成long或ulong等类型也是不正确的。
2.如果确定需要对指针进行截断,那么应使用ptrtolong()和ptrtoulong()两个函数(在basetsd.h中定义)来进行,它们可以屏蔽掉指针截断警告,不过截断的结果不能够再当指针使用了。
3.当某个api函数的out参数能返回一个指针时,应小心谨慎处理参数,在win32中,可以把一个ulong变量的地址进行强制转换后传递给api函数,返回的指针就保存在ulong变量中,但在win64中,返回的指针有64位,如果使用ulong变量的话就会破坏其他变量的内容,正确并且简单的方法是直接定义一个指针变量,把指针变量的地址作为参数传递给api函数。
4.谨慎处理多态参数。在win32中,一个函数可以用一个dword参数来接受多态参数,即该参数在不同情况下可能具有不同的意义,如解释成整型数或指针。在win64中,如果一个多态参数可能被解释成指针,那么决不能把多态参数设为dword类型,而应设为uint-ptr或pvoid类型。win32自身的一部分api函数(如raiseexception())因为不符合该条规则而需要进行修改。
5.使用新的get/setwindowlongptr和get/setclasslongptr api函数。如果在窗口或类的数据区中存放了指针,就需要调用上面的函数来存取相应的变量,为了帮助程序员在编程中正确处理这一点,头文件winuser.h把索引值gwl-wndproc、gwl-hinstance、gwl-hwdparent和gwl_userdata的定义取消了,转而定义了新的索引值gwlp-wndproc、gwlp-hinstance、gwlp-hwdparent和gwlp-userdata。这样下面的代码将会引起编译错误:
setwindowlong(hwnd,gwl-wndproc,(long)mywndproc);
因为gw-wndproc没有定义,正确的代码应为:
setwindowlongptr(hwnd,gwlp-wndproc,(int-ptr)mywndproc);
6.许多窗口和类的数据结构中包含了指针,因此不能在代码中强行指定偏移量来访问数据成员,而应使用field-offset宏来计算偏移量。
7.由于lparam、wparam和lresult通常用来存放指针或整数,在win64中它们全部被扩展成为64位,因此不能把它们与dword、ulong、uint、int、int和long等类型混用,否则可能会无意识地把它们截短了。
关于在win64环境下编程还需要注意的其他问题,以及win64平台下api函数的变化及新增函数,有兴趣的读者可到microsoft的web站点查阅相关资料,或者参考最新版的platform sdk及msdn oline library。
- 在linux 下做过什么开发,来介绍一下(文件传输系统,socket通信过程 ,以及 我使用 多线程同步IO方式 while(1)+fork的方式)
- 为什么用 fork 创建一个线程不可以吗?(可以,说出了 使用线程代码应该如何实现)
- 还能用什么方式?(IO复用技术, 说出select poll epoll 区别 以及 三者的工作原理 和低层数据结构)
- 如果让你重新设计这个 文件传输系统 ,你设计一下 功能点(收发文件,断点续传,文件压缩,用户认证,加密传输,)
- Linux下 如何查看 一个“aaa”进程是否在运行?(ps -ef | grep aaa)
- 管道是什么?介绍下(有名管道 和无名管道 的使用场景 以及 半双工 的特点,管道文件中的数据存放于 内存)
- 还有什么其他的 进程通信方式?(消息队列 共享 内存 和 socket)
- linux下 还做过什么开发?(自己实现过一些简单的命令pwd ls 或者 运行一个可执行文件之类的,使用fork+execl替换)
说一下数据结构把,你常用的数据结构有哪些?或者问你如果逆置一个单链表用什么(栈,面试官说好了 已经有答案了 ,不用说了)
看过源码吗?为什么源码中 多用typedef 去重命名类型(没回答出来)https://www.jb51.net/article/40771.htm
定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
用typedef来定义与平台无关的类型。
为复杂的声明定义一个新的简单的别名。
我司 在北京和武汉 你偏向哪一个?
Linux和Windows开发 你偏向哪一个 ?(长记性了 因为我投的服务器开发 要不假思索 说 Linux )
你还有什么问题要问我?(公司平时 会有大佬做技术分享吗,面试官 回答我 会有,在每个部门内部 有人做不定期的技术分享)
一面 结束 记于2019-8-30
====================================================
自我介绍,(姓名学校,主要研究方向 ,做过的项目,和 实习经历)
一个有1000个结点的二叉树 最多能多高?(全放在左子树 上 或者 全放在右子树上 1000层),那如果是完全二叉树呢?(根据工是 最多结点=2^层数 -1,答 10层)
说一下你理解线程 进程的区别?
那进程间通信的方式呢?
做一道题 求出一串数字中 前K小 的K个数,(先使用了快排,面试官提醒我如果 数据量很大呢? 我说用堆排,写完了堆排,面试官为我能怎么优化,其实只需要建立K个数的 小顶堆即可)
说一下 OSI模型? 每一层的协议?http属于? tcp属于?
udp和tcp的区别? tcp怎么保证可靠?(应答确认 超时重传 和 每个报文有序列号) 具体说下 三次握手的 过程?还有四次挥手(说了time_wait的状态)
在浏览器中输入www.baidu.com之后?(dns协议 以及具体工作过程,tcp传输流式文件,网络层的arp协议 ,路由转发 ,浏览器解析 ),能具体说下 浏览器如何解析吗?
有关注过 http的版本吗?各个版本间有什么区别?(没回答上来)
HTTP协议版本介绍:
HTTP/0.9 :只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0 :第一个在通信中指定的版本号,至今被广泛采用,特别是在代理服务器中。
HTTP/1.1 :当前版本号,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
HTTP/2.0 正在开发中······
HTTP/1.1与HTTP/1.0的区别:
1.persistent connection(持久连接)
HTTP/1.0中,每对请求/ 响应都使用一个新的连接。
HTTP/1.1则支持持久连接(默认)。
做一道网络的题 给一个网络ip地址 请说出这个地址所在网段的 最小ip和 最大 ip(84.125.12.34/22,思路是:先通过 点将四个数字分割开,计算num=,84 左移24位+125左移16位+12左移8位+34,然后22表示子网掩码,就是网络号22位不能更改,主机号10位可以变化,那最小IP是num& 11111111111111111111110000000000 最大ip是 num | 0000000000000000000001111111111 .这个过程 面试官 提示了我很多次,包括没有必要计算其是ABCDE哪一类,没有必要将数字转化成二进制)
讲一下项目把,其中技术点。(这次项目按照模块划分的 来讲)
说一下你平时 使用git的过程?遇到 冲突怎么办?(手动解决文件中的冲突(确定哪些行删除,哪些行保留))
你有什么要问我的吗,(公司这边 使用c++开发 多吗? 面试官回答我 大多转 java 或者 go ,不过语言不是问题,你c++学的扎实的话都能转)