一个 面经

  1. 先聊一个你做的项目(问了项目模块  实现逻辑  技术要点)
  • 项目的引申:设计模式(生产者消费者   监听者)
  •                       如何解决进程间同步问题?(给全局变量,和静态变量加锁,或者只有一个进程往其中写,其余让他们只读)
  •                       怎样看一个函数是不是线程安全的?(是否用到了全局或者静态变量,是否函数内部加锁了 或者只读)
  •                      遇到过内存泄漏吗,如何检测(mtrace,varglind,WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector) ​​​​​),
  •                       如何避免?(使用智能指针,介绍智能指针,自己实现的auto_ptr)
  •                       不使用智能指针的话怎么做?(在程序中自己将指向堆内存的指针记录下来,在程序结束后查看是否一一释放?)
  •                       如何查看?(我可以自己定义一个结构体,里面包含一个void *指针 和 bool标志位,来记录这个指针是否释放了 内存)
  1. ///
  2. c++的项目做了很多  说一下 c++多态,(静多态:重载模板,动多态:继承 虚函数,细说概念  以及使用场景)
  3. 你提到了虚函数,虚函数跟纯虚函数的区别?
  4. 析构可以是虚的吗?
  5. 再说下 隐藏和覆盖的区别?
  6. 解释下 为什么要内存对齐 以及内存对其规则?(1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常    2.硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升    我只回答出第二个,面试官大概想提醒我   将问题引导了 平台上)
  7. 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。

  1. 在linux 下做过什么开发,来介绍一下(文件传输系统,socket通信过程  ,以及 我使用 多线程同步IO方式  while(1)+fork的方式)
  2. 为什么用 fork   创建一个线程不可以吗?(可以,说出了 使用线程代码应该如何实现)
  3. 还能用什么方式?(IO复用技术, 说出select  poll  epoll  区别  以及 三者的工作原理 和低层数据结构)
  4. 如果让你重新设计这个 文件传输系统 ,你设计一下 功能点(收发文件,断点续传,文件压缩,用户认证,加密传输,)
  5. Linux下 如何查看 一个“aaa”进程是否在运行?(ps -ef | grep aaa)
  6. 管道是什么?介绍下(有名管道 和无名管道 的使用场景 以及 半双工 的特点,管道文件中的数据存放于 内存)
  7. 还有什么其他的 进程通信方式?(消息队列  共享 内存 和 socket)
  8. 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++学的扎实的话都能转)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值