vivo面经

1、C/C++里面函数指针和指针函数的区别?

函数指针:一种特殊的指针,它指向函数的入口地址;int (*p)(int,int);

指针函数:返回指针的函数,一个函数,它的返回值是指针;int *p(int,int);

2、指针和引用的区别?

指针从本质上讲是一个变量,指针在逻辑上是独立的,它可以被改变的,包括指针变量的值(所指向的地址)和指针变量的值对应的内存中的数据(所指向地址中所存放的数据)。

引用从本质上讲是一个别名,是另一个变量的同义词,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中不能被改变,即自始至终只能依附于同一个变量。

3、C++的内存管理机制?

(1)内存分配方式:

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

  栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

  自由存储区,自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存

  全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

  常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

(2)内存泄漏:

C++中动态内存分配引发问题的解决方案:

深拷贝、浅拷贝问题;

如何对付内存泄漏:

智能指针;RAII手法;

4、堆和栈中的存储内容    
  栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可  执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈  的,然后是函数中的局部变量。注意静态变量是不入栈的。    当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。    (即函数体内定义的局部变量以及函数的需要上下文保护的变量:程序指针入栈、传入函数的参数入栈)
  堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。  

5、C里面include头文件用双引号包含头文件和用<>包含头文件有什么区别?

加双引号表示,应用程序先在当前的文件夹里面寻找该头文件,若没有找到,再到系统文件夹里去找。一般加双引号多为自己编写的头文件。
加尖括号则表示,应用程序直接到系统文件夹去找该文件。这类多为系统头文件。

6、面向对象的三个特性,分别解释?

(1)封装

封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为

(2)继承

继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。

(3)多态

多态是指父对象中的同一个行为能在其多个子对象中有不同的表现。也就是说子对象可以使用重写父对象中的行为,使其拥有不同于父对象和其它子对象的表现,这就是overriding(重写)。

多态存在的三个必要条件:
  一、要有继承;
  二、要有重写;
  三、父类引用或指针指向子类对象。

7、构造函数和析构函数能被继承吗?

不能!只是调用,而不是继承。C++11可以"继承"构造函数,但本质还是调用,只是一个wrapper。

8、OSI七层模型/五层模型,每一层有哪些协议?

应用层:HTTP DNS FTP 

传输层:TCP UDP

网络层:IP ARP ICMP

数据链路层:

物理层:

9、HTTP跟HTTPS的区别?

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密;端口:80

安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,进行身份验证和加密数据传输的协议;端口:443

10、HTTP请求方法?

GET:向特定的资源发出请求。

POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。

GET重点在从服务器上获取资源,POST重点在向服务器发送数据。

11、HTTP请求报文,响应报文的组成:

请求行(一行)

请求首部字段(0个或多个)

空行(\r\n 回车换行)

消息体

11、HTTP/1.1版本新特性:

长连接:只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求

管线化:客户端可以同时发出多个HTTP请求,而不用一个个等待响应

12、常见的状态码务必要熟悉:

200:客户端请求成功。

302:重定向。

404:请求资源不存在。

400:请求语法错误,服务器无法理解。

403:服务器收到请求,但拒绝提供服务。

500:服务器内部错误。

503:服务器当前不能处理客户端请求,可能需要一段时间后才能恢复正常。

13、服务器端建立连接需要哪些系统调用,按顺序讲(就socket、bind这种)?

服务端:socket(创建套接字)->bind(绑定套接字和端口号)->listen(监听端口号)->accept(接收来自客户端的连接请求)

客户端:socket(创建套接字)->connect(连接指定计算机的端口)

14、TCP和UDP的区别?

TCP面向连接,可靠,基于字节流,而UDP不面向连接,不可靠,基于数据报。

(1)tcp是面向连接的,可靠性高;udp是无连接的,可靠性较低;

(2)由于tcp需要有三次握手、重新确认等连接过程,实时性差;同时过程复杂,也使其易于被攻击;而udp无连接,因而实时性较强,也稍安全;

(3)在传输相同大小的数据时,tcp报头20字节;udp首部开销只有8个字节,tcp报头比udp复杂,故实际包含的用户数据较少。tcp无丢包,而udp有丢包,故tcp开销大,udp开销较小;

(4)每条tcp连接只能是点到点的;udp支持一对一、一对多、多对一、多对多的交互通信。


15、UDP可靠传输

最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。

  • 1、添加seq/ack机制,确保数据发送到对端
  • 2、添加发送和接收缓冲区,主要是用户超时重传。
  • 3、添加超时重传机制。

详细说明:送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。

目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT

16、define和const的区别

(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存(代码段)中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份(数据段)。
(4)从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。(5)从某些特殊功能而言: #define可以用来防止头文件重复引用,而const不能。

17、栈和队列的一些相同点和不同点?

相同点:

(1).都是线性结构。

(2).插入操作都是限定在表尾进行。

(3).都可以通过顺序结构和链式结构实现。、

(4).插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。

18、线性结构和非线性结构?

线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
常用的线性结构有:线性表,栈,队列,双队列,数组,串。
 
非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构(树)和群结构(图)。
常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图。(其中多维数组是由多个一维数组组成的,所以不再是线性结构)

19、线性表?二叉线索树?

(1)线性表定义:

线性表是具有相同特性的数据元素的一个有限序列。线性表一般表示为:

      L = (a1, a2, …, ai,ai+1 ,…, an)

(2)线性表的存储结构:

顺序存储结构、链式存储结构

20、struct和public的区别

(1)默认的继承访问权限:struct是public的,class是private的。

(2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的

21、滑动窗口协议 
滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。 
只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。    
收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。    
当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值