5-20大华面经总结

C++多态

当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。多态意味着调用成员函数时,会根据调用函数的不同对象类型来执行不同的函数。
主要包括两种多态:
1.静态多态:(编译期间完成)主要指的是函数重载和函数模板的使用。
2.动态多态:(运行期间指定)主要通过继承类之间的虚函数实现,派生类对象的地址可以赋值给基类指针,当通过基类指针或者引用调用基类和派生类中均存在的虚函数时,能够动态的识别出应该调用基类还是派生类的函数。

构造函数可以为虚函数吗,析构函数

构造函数不能定义为虚函数,主要原因有以下几点:
1.虚函数需要通过虚函数表指针调用,该指针存放在对象的内存空间中。在构造函数调用之前,对象没有进行实例化,也没有进行内存空间的分配,因此无法通过虚函数指针调用指向地址的虚函数。
2.虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
3.虚函数一般使用在当前指针或引用对象类型不确定时确定类型,而创建一个对象需要知道其对象类型。在构造一个对象时,对象尚未创建,无法确定该对象的类型。
析构函数一般设置为虚函数:因为在使用父类指针或引用指向子类对象时,需要防止父类析构而不析构派生类导致内存泄漏情况的发生。如果不设置析构函数为虚函数,那么基类析构时只会释放基类的空间,不会对子类对象进行析构以及子类对象资源释放。

不能为虚函数的情况
只有类的成员函数才能声明为虚函数,虚函数仅适用于有继承关系的类对象。
普通函数不能声明为虚函数。
静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
内联函数(inline)不能是虚函数,因为内联函数不能在运行中动态确定位置。
构造函数不能是虚函数。析构函数可以是虚函数,而且建议声明为虚函数。

Tcp粘包问题

问题

TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

解决

1.固定包的长度
顾名思义,即每个协议包的长度都是固定的。举个例子,例如我们可以规定每个协议包的大小是 64 个字节,每次收满 64 个字节,就取出来解析(如果不够,就先存起来)。
这种通信协议的格式简单但灵活性差。如果包内容不足指定的字节数,剩余的空间需要填充特殊的信息,如 \0(如果不填充特殊内容,如何区分包里面的正常内容与填充信息呢?);如果包内容超过指定字节数,又得分包分片,需要增加额外处理逻辑——在发送端进行分包分片,在接收端重新组装包片(分包和分片内容在接下来会详细介绍)。

2.以指定字符作为包结束的标志
这种协议包比较常见,即字节流中遇到特殊的符号值时就认为到一个包的末尾了。例如,我们熟悉的 FTP协议,发邮件的 SMTP 协议,一个命令或者一段数据后面加上"\r\n"表示一个包的结束。对端收到后,每遇到一个”\r\n“就把之前的数据当做一个数据包。
这种协议一般用于一些包含各种命令控制的应用中,其不足之处就是如果协议数据包内容部分需要使用包结束标志字符,就需要对这些字符做转码或者转义操作,以免被接收方错误地当成包结束标志而误解析。

3.设置包头+包体的格式
这种格式的包一般分为两部分,即包头和包体,包头是固定大小的,且包头中必须含有一个字段来说明接下来的包体有多大。

map,unordered_map,multimap

map底层实现是红黑树,存在map中的数据相当于红黑树的节点,由于红黑树的特性,因此存储在map中的数据是有序的,按键值排列且不允许键值重复。需要建立红黑树。
hashmap底层实现是哈希表,底层实现为数组加链表加哈希函数映射的方式。存储在hashmap下的数据是无序的,不允许键值重复,对查询操作的效率较高。需要建立哈希表。
请添加图片描述

poll,epoll

epoll底层实现
第一点,epoll 在内核里使用红黑树来跟踪进程所有待检测的文件描述字,把需要监控的 socket 通过 epoll_ctl() 函数加入内核中的红黑树里,红黑树是个高效的数据结构,增删查一般时间复杂度是 O(logn),通过对这棵黑红树进行操作,这样就不需要像 select/poll 每次操作时都传入整个 socket 集合,只需要传入一个待检测的 socket,减少了内核和用户空间大量的数据拷贝和内存分配。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。
第二点, epoll 使用事件驱动的机制,内核里维护了一个链表来记录就绪事件,当某个 socket 有事件发生时,通过回调函数内核会将其加入到这个就绪事件列表中,当用户调用 epoll_wait() 函数时,只会返回有事件发生的文件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合,大大提高了检测的效率。大多数情况下其复杂度接近于O(1)。平均时间O1,最坏时间On;
链接

请添加图片描述
在这里插入图片描述

智能指针

auto_ptr unique_ptr shared_ptr weak_ptr

多线程之间的独享资源以及同步方式

多线程之间独享栈和寄存器
多线程之间同步方式:
信号量 条件变量 互斥锁 读写锁

大文件传输及零拷贝相关问题

传输大文件的时候,由于大文件难以命中 PageCache 缓存,而且会占满 PageCache 导致「热点」文件无法充分利用缓存,从而增大了性能开销,因此,这时应该使用直接 I/O。
在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术。
链接: 小林coding

MySQL存储引擎,索引,事务

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值