秋招面试总结

news2024/11/19 13:41:25

八股

  • C++中传引用传指针的区别:参考

    • 指针传参:
      • 本质是值传递,形参的指针变量是个临时局部变量,用来接收外部实参指针变量保存的地址值
      • 除了解引用对地址内存进行操作外,形参指针变量的其他任何操作都不会影响到外面的实参指针
      • 可以修改形参指针指向,不会影响到实参指针的指向
      • 可以传空指针
    • 引用传参:
      • 本质是引用传递,传进入的相当于就是实参本身,会在函数中开辟内存存放,引用参数本身和外面的变量不是独立的,会相互影响;
      • 对形参的任何操作都会影响到实参,不存在解引用的情况
      • 不能传空引用
    • 就函数外部而已,需要定义一个指针变量,引用话不需要
  • 一个函数什么时候返回引用,什么时候返回指针

    • C++三种传递方式:值传递,指针传递,引用传递
    • 返回的指针和引用区别不大,主要是看返回值的类型,如果类型是值的形式是会产生副本的????晕,需要改
    • 需要注意的是,不能返回临时对象的指针或者引用,因为对应的地址,在栈帧回退的时候就不能使用了,
  • 什么是野指针,如何避免野指针

    • 没有进行初始化的指针,指向未知的内存空间
    • 如何避免:在顶一个指针变量的时候,进行初始化,删除一个指针指向的堆地址的时候,进行指控,也可以通过智能指针进行管理裸指针进行避免
  • 智能指针有哪些?为什么时候需要用到weak_ptr?

    • auto_ptrunique_ptrshared_ptrweak_ptr,其中后面三个是C++11新引入的
    • auto_ptrunique_ptr是独占式的智能指针,不带引用计数,资源只能由一个智能指针对象进行管理,shared_ptrweak_ptr是共享式,带引用计数的智能指针
    • weak_ptr主要搭配shared_ptr一起使用,用来观察shared_ptr管理的资源的生命周期,weak_ptr可以用来避免shared_ptr的循环引用问题
  • C++有哪些方式实现多态?

    • 静态多态和动态多态,静态多态是编译时期的多态,分别有函数重载,和模板特别化
    • 动态多态,指的是在继承关系种,子类重复父类虚函数,在运行时期实现的接口复用的多态
  • 运行时多态涉及的函数绑定是在什么时期发生的

    • 绑定分为静态绑定和动态绑定,静态绑定针对的是非虚函数,在编译阶段确定调用的具体函数
    • 动态绑定,一般是通过父类指针指向子类对象实现的,由于在编译阶段不确定具体调用的函数,因为子类会重写父类虚函数,在运行时期,父类指针通过虚函数指针,访问虚函数表,如果子类重写了父类的虚函数,在对应位置调用的就是子类虚函数的地址,如果没有重写调用的就是父类的虚函数
  • 多继承情况下,子类继承多个父类,父类都有虚函数,子类同时改写了多个父类虚函数,这种情况,子类的内存布局

    class Base1
    {
    public:
    	virtual void func1(){}
    	int a;
    }
    class Base2
    {
    public:
    	virtual void func2(){}
    	int b;
    }
    class Son:public Base1,public Base2
    {
    public:
    	void func1(){cout<<"Son::func1"<<endl;}
    	void func2(){cout<<"Son::func2"<<endl;}
    	int c;
    }
    int main()
    {
    	Son s;
    	/* s的内存布局
    	Base1::
    		vfptr
    		a
    	Base2::
    		vfptr
    		b
    	c
    	*/
    	return 0;
    }
    
  • 多继承中,菱形继承的问题,如何处理二义性的字段

    • B继承A,C继承A,D继承B和C,D中可能有多个A的成员变量,可以通过虚继承解决,让虚基类最优先构造
    • 内存布局:
      #include<iostream>
      using namespace std;
      class A
      {
      public:
      	A() { cout << "A" << endl; }
      	virtual void func(){}
      private:
      	int aa;
      };
      class test1 : virtual public A
      {
      public:
      	test1() { cout << "test1" << endl; }
      	int a;
      	virtual void func1(){}
      };
      class test2 : virtual public A
      {
      public:
      	test2() { cout << "test2" << endl; }
      	int b;
      	virtual void func2(){}
      };
      class derive2 :public test1, public test2
      {
      public:
      	derive2() { cout << "derive2" << endl; }
      private:
      	int c;
      	void func1(){}
      	void func2(){}
      	virtual void func3(){}
      };
      // 上面代码需要注意的是,由于是多继承,所以会有多个虚函数指针
      // 如果不是多继承,则只会有一个虚函数指针,相当于,子类和父类的指针合在一起
      // 并且虚函数表合并,虚函数表中虚函数的位置是根据函数出现的先后顺序决定的
      
      在这里插入图片描述
  • STL map中有两种,一种是map,一种是unorderd_map

    • unorderd_mapmap之间的区别:
      • unorderd_map: 底层数据结构是hashtable,是无序的,增删查的时间复杂度O(1)
      • map:底层数据结构是红黑树,中序有序,增删查的时间复杂度O(log n)
    • unorderd_map的hash结构是如何实现hash算法的?
      • 无序映射表,底层是用一个vector维护bucket桶的数据结构,vector的每个元素都是一个bucket,可以说是链表,因为是通过开链法解决hash冲突的,unorderd_map每插入一个元素,都先是根据key计算hashcode,再根据hashcode将对应的节点插到对应的bucket链表
    • hash表是如何扩容的
      • 有个负载因子和最大负载因子,其中负载因子是当前元素个数个底层bucket个数比,当负载因子>=最大负载因子就会发生rehash,也就是扩容再重入插入,主要是防止同一个bucket上元素太多导致索引效率下降
      • VS中,底层vector默认的bucket个数是8,每次发送扩容的时候以8的倍数进行扩容,即扩容一次bucket个数为64
  • C++中动态库和静态库的区别

    • 静态库: 运行时确认地址
    • 动态库: 编译时确认地址
  • string类的大小问题:string内存布局

    • VS x86系统下,sizeof(string)=28 ,x64体系下sizeof(string)=40
    • x86下为28的原因:
      • 4字节Allocator + 4字节Size + 4字节Capacitry + 16个字节原始字符串大小
      • 16个字节原始字符串大小:1字节结束符'\0' + 最大可以存储15个字节的
      • 当字符长度<=15的时候,就保存在15原始字节里面(和string对应可能一起在栈上),如果>15就保存在堆上,指向堆内存的指针存放到15字节前4字节
    • TIP
      • 不同编译器string底层成员可能不一样,即不同编译器sizeof出来的结果可能不同,但是sizeof string大小是固定不变的
      • sizeof:是操作符,不是函数,返回对象或者类型的占用的字节数,sizeof详解
  • C++内存对齐的原则

    • 提高cpu读取效率

    • 例子展示:

      class A//8字节
      {
      public:
      	char a;
      	char b;//padding2
      	int c;
      }
      class B //12字节
      {
      public:
      	char a; //padding 3
      	int b;
      	char c;//padding 3
      }
      
  • STL是怎么做内存管理的,allocator分配器的原理,空间配置器

    • allocator分配器的策略,一级配置器和二级配置器
  • 计算机中虚拟地址和物理地址是什么

    • 一个进程加载进入内存,是不会分配实际的物理地址,只有运行到对应需要的内存时候,就会通过页表将虚拟地址映射到实际的物理地址中
  • 设计模式,C++如何实现单例模式

    • 拷贝构造和普通构造私有化,只对外提供一个获取唯一实例的static接口函数,这个接口函数,返回的是私有成员中static的静态对象,一般在类内声明类外实现,通过类的作用域访问接口函数获取唯一实例,单例模式一般分为懒汉式和饿汉式,饿汉式是没有调用接口,在编译阶段对象就存在,是线程安全的,懒汉式是第一个调用接口的时候才进行实例化,是线程不安全的
    • 手动实现一个
  • TCP和UDP的区别

    • UDP有明显的丢包乱序的问题,以UDP的方式来传输,如何解决丢包乱序的问题,如何知道包丢了,如果
  • 出于什么目的做自己的项目:

  • 多线程如何解决高并发问题: 并发-同时能承载客户端数量(稳定的维护)

    • C10k: 1w的并发
      • 早期只有select/poll,select每次调用都需要将的fd_set(1024=1k)拷贝到内核中,Poll需要将大量的pllfd数组(没有限制),每次将fd_set和pollfd数组拷贝进内核并拷贝出来,会影响性能。
      • 所以普通的select只能解决C10k问题(select管理的fd超过1024性能会急剧下降)
    • C1000k:100w并发
      • 通过epoll来解决,没有大量的fd拷贝在内核和用户空间中,全存放在底层的红黑树节点上,只会将发送时间的集合进行返回,因此相比select而已不需要每次都拷贝,因此epoll可以使得网IO的数量级达到100w级别
    • C10M :1000w并发
      • 网络IO并发量的限制,为什么做不到C10M,
        • 不是CPU的限制(IO不属于计算密集型),也不是内存大小的限制(完全可以加物理硬件解决),也不是磁盘的问题,也不是文件系统的限制
        • 是操作系统层面的限制,第一个是系统调用中断,一个是数据在内核和用户空间的限制,还一个网卡的限制,可以通过用户态协议栈解决前面两种问题,用户态协议栈本身可以解决系统中断的问题,并将网卡数据直接映射到用户空间的协议栈中
  • 多线程中,每个连接都需要操作mysql数据库,如何解决IO瓶颈的问题

  • C++构造函数和析构函数可以抛异常吗,参考

    • 构造函数可以抛出异常, 当抛出异常的时候,析构函数不会被执行,需要手动释放内部申请的资源
    • 析构函数不应该抛出异常,程序可能发生未知错误,可能会莫名其妙的蹦吊,当析构有异常的时候应该是在析构函数内部处理,而不是抛出来
  • SLT优先级队列

    • 如何实现:底层是依赖vector容器实现的大根堆
    • 创建大根堆的流程:
      • 自顶向下:从第一个数据开始插入建立大根堆,每次插入最多可能都需要维护O(log n)次,时间复杂度O(nlogn)
      • 自低向上:假设树存在,从最后一个有孩子节点的节点开始维护堆,时间复杂度O(n)
  • C++11关键字default: 参考

    • 前置:如果自己提供了构造函数,编译器不会提供默认的,默认的拷贝构造还是存在的,如果自己只提供了拷贝构造,编译器不会提供默认的构造,也不会提供默认的拷贝构造
    • 定义: 可以作用于默认构造函数、拷贝构造函数、复制重载函数、析构函数,提供编译器默认的实现
    • 一般对构造函数进行重载,编译器是不会隐式生成默认构造,如果通过默认构造生成对象会报错,所以一般需要重写默认构造,而default标记重写的默认构造函数,编译器会隐式生成一个版本,在代码层面可以更加的简洁,且编译器生成的版本效率更高,default使得编译器提供的版本和自己重载的默认构造可以共存
  • C++11的移动语义:

    • std::move :将左值可以转成右值,用于匹配右值拷贝和右值赋值重载,将对象底层管理的堆上的资源进行转移
  • 进程间通信有哪些方式:

    • socket、信号量、管道、消息队列,共享内存
  • 共享内存如何解决消息通信的安全问题,参考

    • 共享内存的是进程间共享数据最快的方法,不涉及数据在多个进程间的拷贝问题
    • 可以在共享内存中,使用mutex保证通信的进程安全问题,mutex占用的内存必须是共享内存
  • 线程安全和可重入的区别:参考

    • 线程安全:多线程访问全局或者静态变量需要加锁进行,保证原子性
    • 可重入函数:线程被不同的线程调用,结果总是正确的 ,也就是说是线程安全的
  • gdb的基本操作:

    • 看当前线程的栈:bt
    • 看其他线程栈:info threadsthreads+线程编号bt
  • gdb可以给子进程加断点吗,如何加

    • fork相关函数简单介绍: PCB、fork

      • pid_t fork(void): 用于创建一个子进程,调用一次会有两次返回值,在父进程中返回子进程的进程id,在子进程返回0,如果出错就会返回复值,创建的子进程,会复制父进程的代码段、数据段、BSS段、堆栈等所有的用户空间信息,内核中OS会重新申请一个PCB,并用父进程的PCB进行初始化
      • pid_t getpid(): 获取当前进程的pid
      • pid_t getppid():获取当前进程的父进程pid
    • gdb调试多进程:

      • 只调试子进程:
        • set follow-fork-mode child:只调试子进程,可以在进程里面设置断点,然后run
      • 多个进程调试:
        • set detach-on-fork off: 设置off,一个线程暂停,其他线程也暂停,就可以同时调试多个线程
        • info inferiors:查看进程信息,前提是进程被主进程创建
        • inferiors id:切换进程,加断点可以切换进程加断点
        • 其他操作和线程一样
    • 调试正在运行的子进程

      • attach pid:就会切换这个进程,然后可以通过gdb进行调试,前提要知道进程pid
  • centos如何管理软件包:参考

    • 软件包管理:堆linux下的软件及安装包进行管理,比如下载、安装、卸载、删除等操作
    • centos软件包管理工具有两种:rpmyum
    • yum命令:
      • 安装包:yum -y install 包名
      • 列出所有可按转的软件包:yum list
      • 列出所有可更新的软件包:yum list updates
      • 列出所有已经安装的软件包:yum list installed
      • 查找包:yum search 包关键字
      • 移除包:yum remove 安装包/关键字
  • linux给定一个文本,有两列,每列通过空格分割,如何将第二列提取出来,用shell命令实现,有时间再看

  • 死锁产生的条件:

    • 互斥条件:一个公共资源同时时刻只能给一个进程/线程使用
    • 不可剥夺条件:进程/线程把资源使用完之前,其他进程/线程拿不到
    • 请求和保持条件:进程/线程申请新资源的同时保留已申请的资源
    • 循环等待:存在进程/线程A等待进程/线程B的资源,反之亦然,形成了一个等待环路
    • 预防死锁:破坏后面三个条件,但是互斥条件是保证进程/线程同步的基础不能去破坏
    • 避免死锁:动态检查等待资源的进程/线程资源状态,如果分配后不会死锁就分配,会的花就释放它的资源
  • C和C++的区别:

    • C++面向对象,C面向过程
    • C++有函数重载,C没有
    • C++是new/delete,C是malloc和free
    • C++有引用,C没有引用

代码

  • 实现一个简单的单例模式,参考
  • LRU最少最近使用算法实现,参考
  • 不用加法的加法,代码连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov5自定义模型训练一

要拿yolo来用到自己希望使用的场合就需要自己来训练模型权重&#xff0c;要训练模型权重需要足够的训练数据集&#xff0c;数据越多训练后的模型权重越准确。 数据集需要按yolov5的格式进行收集&#xff0c;收集图片后需要用标注工具进行标注&#xff0c;常用的有LabelImg软件…

Redis——》Pipeline

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

小学生演讲与口才教案设计

教案设计&#xff1a;小学生演讲与口才 教学目标&#xff1a; 1. 培养学生的演讲能力和口才表达能力。 2. 培养学生的自信心和沟通能力。 3. 提高学生的思维逻辑和语言组织能力。 教学重点&#xff1a; 教学重点一&#xff1a;演讲技巧的培养 演讲技巧是指在演讲过程中运…

Python科研绘图--Task05

目录 SciencePlots 安装SciencePlots 安装LaTeX ① 安装 MikTex 和 Ghostscript ② 将软件的安装路径添加到系统环境变量中 SciencePlots 绘图示例 SciencePlots 虽然 Matplotlib 或 ProPlot 库能够绘制出插图结果&#xff0c;但用户还需要根据期刊的配图绘制要求进行…

简易虚拟培训系统-UI控件的应用3

目录 Button组件的组成 Button组件方法1-在Button组件中设置OnClick()回调 Button组件方法2-在脚本中添加Button类的监听 上一篇使用了文件流读取硬盘数据并显示在Text组件中&#xff0c;本篇增加使用按钮来控制显示哪一篇文字信息。 Button组件的组成 1. 新建Button&#…

由北京筑龙承建的“黔云招采—贵州高速板块”正式上线

8月28日&#xff0c;由北京筑龙承建的黔云招采电子招标采购交易平台首个行业板块——贵州高速板块正式上线运行。该板块实现了资源共享和数据隔离&#xff0c;提升了系统可扩展性和业务灵活性&#xff0c;切实满足了贵州高速集团交易业务独立运营的要求。 贵州高速板块由黔云招…

HTML之动态点连线

做一个动态点连线的效果。 每个点会随机进行移动&#xff0c;点移动到靠近的点之后&#xff0c;就会连接到这个点&#xff0c;以此类推。 详情注释看源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&quo…

L1-041 寻找250(Python实现) 测试点全过

题目 对方不想和你说话&#xff0c;并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式 输入在一行中给出不知道多少个绝对值不超过1000的整数&#xff0c;其中保证至少存在一个“250”。 输出格式&#xff1a; 在一行中输出第一次出现…

Java异常-Could not initialize plugin: interface org.mockito.plugins.MockMaker

跑单元测试&#xff0c;报如下错误&#xff1a; java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84) …

LLM本地知识库问答系统(二):如何正确使用LlamaIndex索引

推荐阅读列表&#xff1a; LLM本地知识库问答系统&#xff08;一&#xff09;&#xff1a;使用LangChain和LlamaIndex从零构建PDF聊天机器人指南 上一篇文章我们介绍了使用LlamaIndex构建PDF聊天机器人&#xff0c;本文将介绍一下LlamaIndex的基本概念和原理。 LlamaIndex简介…

十年测试工程师叙述自动化测试学习思路

自动化测试介绍 自动化测试(Automated Testing)&#xff0c;是指把以人为驱动的测试行为转化为机器执行的过程。实际上自动化测试往往通过一些测试工具或框架&#xff0c;编写自动化测试用例&#xff0c;来模拟手工测试过程。比如说&#xff0c;在项目迭代过程中&#xff0c;持…

正则常见问题及解决方案

使用正则处理问题的基本思路。有一些方法比较固定&#xff0c;比如将问题分解成多个小问题&#xff0c;每个小问题见招拆招&#xff1a;某个位置上可能有多个字符的话&#xff0c;就⽤字符组。某个位置上有多个字符串的话&#xff0c;就⽤多选结构。出现的次数不确定的话&#…

WSL /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

/sbin/ldconfig.real: Can’t link /usr/lib/wsl/lib/libnvoptix_loader.so.1 to libnvoptix.so.1 /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link 解决&#xff1a;https://github.com/microsoft/WSL/issues/5548 There is another solution w…

使用Spring Boot和Kafka实现消息订阅和发送

文章目录 一&#xff0c;新建Spring Boot1&#xff0c;Maven配置2&#xff0c;无法识别为SpringBoot项目3&#xff0c;无效的源发行版4&#xff0c;无法访问SpringApplication5&#xff0c;运行直接Finish6&#xff0c;服务运行成功 二&#xff0c;安装启动Kafka1&#xff0c;下…

RHCE——十二、Mysql服务

Mysql服务 一、什么是数据库1、数据&#xff1a;2、数据库&#xff1a; 二、mysql概述三、版本及下载四、yum仓库安装1、添加yum源2、安装3、后续配置 五、本地RPM包安装1、使用迅雷下载集合包2、上传数据3、安装 六、生产环境中使用通用二进制包安装1、作用2、软件包下载3、使…

three.js(六):自适应设备分辨率

自适应设备分辨率 当今大多数的PC端和移动端显示器都是HD-DPI显示器。HD-DPI 是High Definition-Dots Per Inch 的简称&#xff0c;意思是高分辨率显示器。不同设备的显示器的分辨率是不一样的。 以上图中的iPhone6/7/8 为例&#xff1a;375*667 代表的手机的屏幕的物理尺寸&a…

Spring-5.0.x源码下载及本地环境搭建

一、Spring源码下载 从github上下载Spring的源代码 下载地址&#xff1a;https://github.com/spring-projects/spring-framework 访问地址之后&#xff0c;打开Spring的代码页面找到你想下载的版本&#xff0c;如5.0.x&#xff0c;如下图所示&#xff1a; 下载方式一&#x…

【08期】ArrayList常见面试题

简介 ArrayList是我们开发中非常常用的数据存储容器之一&#xff0c;其底层是数组实现的&#xff0c;我们可以在集合中存储任意类型的数据&#xff0c;ArrayList是线程不安全的&#xff0c;非常适合用于对元素进行查找&#xff0c;效率非常高。 线程安全性 对ArrayList的操作…

【计算机组成 课程笔记】1.2 冯·诺伊曼结构

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 1 - 2 - 102-冯诺依曼结构的要点&#xff08;13-59--&#xff09;_哔哩哔哩_bilibili 现代的计算机形态各异&#xff0c;但究其本质&#xff0c;几乎全部采用了冯诺依曼结构。要了解计算机&#xff0c;首先要知道…

内网实战1

1、信息收集&#xff1a; 使用nmap做端口扫描&#xff1a; nmap -sV -Pn -T4 192.168.26.174重要端口&#xff1a;80、445、139、135、3306 目录扫描&#xff1a; 访问80端口&#xff1a;发现一个网站是phpstudy搭建的&#xff1b; 发现一个mysql数据库&#xff0c;那我们…