寒武纪一面

来源:互联网 发布:苹果笔记本软件下载 编辑:程序博客网 时间:2024/05/17 00:05

1.vector中resize() 和 reserve() 函数的区别?

reserve 容器预留空间 ,但并不真正创建对象,在创建对象前,不能引用容器内元素, 因此加入元素后,需要push_baxck() 和 insert()函数
resize() 改变容器大小,并且创建对象。调用函数后,可以直接引用容器内对象。
reserve()只有一个参数, 即需要预留容器的空间
resize() 连那个歌参数,第一个容器新的大小,第二个是加入容器中的新元素
共同点是:都保证了vector中空间(capacity)的大小,但是resize() 会调整 size() 的大小

2.说一下new\delete 和malloc/free函数的区别? malloc是库函数吗? 还是系统调用函数?
3.LeetCode题刷完了吗?
4.写一个插入排序不够流利

5.static 的作用?

面向过程中:
1.修饰全局变量

静态全局变量特点:
1.该变量在全局数据区分配内存
2.未经初始化的静态全局变量会被程序自动初始成0(自动变量是随机值)
3.静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的 (其他文件中可以定义相同名字的变量,不会发生冲突)

2.静态局部变量
特点:
1.该变量在全局数据区分配内存
2.程序执行到对象的声明处时被首次初始化,即以后的函数调用不会再次进行初始化
3.静态局部变量一般在声明处初始化,如果没有显示初始化,会被程序自动初始化成0;
4.作用域不变,当定义的函数或者语句块时,其作用与随之结束。

3.静态函数

特点: 与普通函数不同,它只在声明它的文件当中可见,不能被其它文件使用

使用好处:

1.静态函数不能被其他文件使用
2.其他文件中可以定义同名的函数,不会发生冲突

面向对象中:

1.静态数据成员

特点:

1.对于非静态成员,每个类对象都有自己的拷贝,而静态数据成员被当作是类的成员。 无论类被定义了多次,静态数据成员在程序中只有一份。该类型对所有的对象共享访问
,因此在多线程环境下,可能会出现脏读事情

2.静态数据成员存储在全局数据区,静态数据成员定义是要分配空间,所以不能再类声明中出现。
相比较于全局变量相比,优点:
1.可以实现信息隐藏,数据成员可以是private 成员,而全局变量不能。
2.可以使用类名来进行访问,不需要创建出对象

2.静态成员函数

特点: 区别与普通成员函数是,其没有this指针,它不属于某一个对象拥有,他属于整个类所有

优点:
由于没有this指针的开销,静态成员函数相比较全局函数,速度上会有少许的增长

6.你了解面向对象吗? 封装,继承、多态

7.你喜欢深圳吗?
8.你对我么公司了解吗?宣讲会来了吗?
9.你还有什么问题要问吗?

10.堆和栈的区别?

1.有一个形象的比喻可以说明这个问题
使用栈就相当于我们去饭馆里吃饭,只管点菜(发出申请)、付费、和吃(使用),吃饱了就走,不用理会切菜、洗菜、和准备工作、刷锅等扫尾工作,它的好处是快捷,自由度比较小

使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是不叫符合自己的口味,而且自由度大。

细节上讲就是:

1.申请大小限制
2.申请效率: 栈有系统自动分配,速度比较快但是成员无法控制 堆:一般速度比较慢,而且容易产生碎片,不过使用起来最方便。
3.栈向下生长 堆区向上生长
4.栈 在x86平台下默认 1M 堆内存在相同的平台下可以达到2.5G的样子
5.栈的维护 严格最后先进后出的规则,管理起来非常方便,而堆的申请很麻烦,回收更麻烦(链表,在链表上 找第一个大于当前比申请的内存大的了空间,剩余的重新挂到链表上,),还会造成内存碎片的问题
6.存储内容: 栈里面存储函数的参数(从右向左),和局部变量 堆中的内容有程序员自己分配

为什么要有栈区?为什么要有堆?

如果没有堆区,一切变量的申请释放都需要程序员自己维护,如果写一个递归程序,那释放起来就会相当壮观了

栈的好处是:方便、快、有效避免内存碎片化。
栈的问题是:不利于管理大内存(尤其在16位和32位时代)、数据的生命周期难于控制(栈内的有效数据通常是连续存储的,所以pop时后申请的内存必须早于先申请的内存失效),所以栈不利于动态地管理并且有效地利用宝贵的内存资源。于是我们有了堆。。。

为什么栈相对堆很小?

1.大块内存不适合动态【增长/回退】,对于短声明周期对的块尽量动态增长,
2.堆通常是进程内共用的,栈通常是线程私有的,一个进程包含多个线程,就有必要比栈大了
3,栈大小其实也是可以调整的

原创粉丝点击