OPPO2019春季校园招聘C/C++开发(手机方向)面试总结

6 篇文章 1 订阅

本科软件工程普通学生一枚,春招之路,记录下心得

面试过程

首先一上来面试官先介绍了下自己,然后让我做个自我介绍,我像往常一下介绍了下自己的项目经验和实习经历,阐述了一下求职意向。

接着面试官从我的专业基础问起,问我在校学的最好的专业课是啥,我说是计算机网络和操作系统,然后他就问我操作系统主要讲了啥,然后我从进程管理,内存管理,文件管理和设备管理这几个方面讲了一下一些。(实际上并不准确,进程管理属于处理机调度的范畴,内存管理只是存储管理的一小块,还包括辅存的管理等等,IO管理也没有说,这一部分事后回想了一下答得不是很好)

c语言内存结构与struct内存对齐

接着他问我是否学过c语言,我说大学里学的《C++程序设计》起初讲过c一部分的基础,接着他问了我两个常见的问题,一个是静态变量,全局变量和局部变量以及malloc,new的变量如何存储,我说局部变量存储在栈中,new和malloc属于动态内存分配,他们分配的变量存储在堆中,全局和静态变量都存储在全局和静态数据区,初始化的在data段,未初始化的在bss段。(这部分也不是很准确,C语言和C++的内存结构有一点点不一样,C++中已不再区分初始化的和未初始化的全局变量和静态变量,他们都存放在同一块地方,C++中malloc分配的内存在自由存储区,和堆很类似)

第二个问题是C++的内存对齐,32位机中,一个struct,其中一个成员变量是int类型,一个是char类型,一个是short类型,问整个结构体所占用的内存大小,我说大小是8个字节,因为struct的大小是其中最宽类型大小的整数倍。(一部分正确,如果第一个成员是int类型,后面是char和short,确实是8字节没错,但如果第一个成员是char类型,第二个和第三个成员是int型和short型,则整个结构体的大小应该是12字节,因为此时char类型是第一个数据成员,放在offset为0的地方,后面每个成员相对于结构体首地址的偏移量都是某个数(#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个)的整数倍,#pragma pack(n)如果没有显示设定,缺省为8,所以这里int(4个字节)和8中较小者是4,所以int这个成员变量的摆放位置必须是4的倍数,由于第一个位置已经被char占了,所以只能放在距首地址偏移4个字节处,此时总共占8个字节,后面short紧接着8字节偏移处再放两个字节,由于最后结构体也要按照最大的成员数据类型的宽度对齐,所以最后总大小是12(4 X 3),不是10)

在VS中测试结果如下:

#include <iostream>
using namespace std;
struct a {
	int i;
	char c;
	short s;
};

int main()
{
    cout << sizeof(a)<<endl; 
}

输出结果:
在这里插入图片描述

#include <iostream>
using namespace std;
struct a {	
	char c;
	int i;
	short s;
};

int main()
{
    cout << sizeof(a)<<endl; 
}

输出结果
在这里插入图片描述

如果加上#pragma pack(n)就得比较其值和要存放的成员数据类型的大小,取其中较小者作为对齐的边界

#include <iostream>
#pragma pack(2)
using namespace std;
struct a {	
	char c;
	int i;
	short s;
};

int main()
{
    cout << sizeof(a)<<endl; 
}

以2为对界,int存放在第二个字节偏移处
输出结果
在这里插入图片描述
以1为对界

#include <iostream>
#pragma pack(1)
using namespace std;
struct a {	
	char c;
	int i;
	short s;
};

int main()
{
    cout << sizeof(a)<<endl; 
}

输出结果
在这里插入图片描述

项目经验

接着面试官让我说出一两个最能体现我软件编程功底的一个项目,当时愣了一跳,一个普通的应届毕业生,着实谈不上什么功底,就选了我和同学一起开发的一个移动会议App(算个半成品)。给他讲了用的MVP架构,以及对一些基类的封装,面向接口编程的一些细节,通过封装基类,让类与类之间的耦合发生在高层,而不是底层具体的实现类(实际上这些道理也是我看视频,看书学的)。然后就着重讲了一下,Netty写服务端和自己用protocol buffer 编解码的内容。然后他问我从项目中学到了什么,我就说,学会了如何去封装一些基类,如何去对软件解耦合;学到了JAVA的NIO框架,Netty 这种非阻塞式IO的优势(当时看过一些视频解析它的源码)(对一些自己用到过的框架,分析他的源码和底层实现有利于提高我们的技术深度和工程素养),同时学到了Google的protocol buffer这个序列化协议相对于XML,Json这些传统的数据存储传输方法的独特优势。

接着他继续看我的简历,看到我项目中有使用过OpenGL ES和OpenCV,就问我OpenGL的一些东西,接着又问我着色器语言,我简单的说了下着色器语言的语法,比如什么Uniform变量啊,vary变量啊,但是顶点着色器和片元着色器以及着色器程序这些重点忘说了,感觉有点不应该

接下来讨论了一些兴趣爱好和未来的规划啥的,最后到我的提问环节,我问了一些他们业务相关的问题然后这次面试就结束了。

总结

总结一下,整体的感觉很好,面试官人还不错,但是自己确实有好几个问题本来能答得更好的没有回答好,不是忘了一些,就是没有考虑清楚面试官的问题,希望后面能够做的更好。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值