C++高频面试题总结

第一题:C struct与C++ struct的区别?struct 和 class的区别?

C++ struct 相比 C struct 扩充了:
1.成员函数
2.继承
3.多态

//c
strcut A
{
	int a;
	int b;
}
//c++
strcut A:public base
{
	void fuctionA();
	virtual void fuctionB();
	int a;
	int b;
}

c++ struct 和 class的区别:
1.默认的继承访问权限。class默认的是private,strcut默认的是public;
2.默认的成员变量访问权限。class默认的成员变量访问是private,struct默认的成员变量访问是public;

第二题:C++类成员public/private/protected的访问权限?继承关系下的访问权限?

1.非继承关系
public:变量和函数在类内外都可以访问;
protected:变量和函数只能在类内函数和派生类内函数和友元类共享;
private:变量和函数只能类内函数和友元类访问;
2.继承关系下的访问权限
子类继承方式 :

class child :public/protected/private Parent

父类中的访问级别 :

公有成员 : public
保护成员 : protected
私有成员 : private

public继承:访问权限保持不变
protect继承:private不变,其他变为protect
private继承:全都变为private

第三题:new和malloc的区别?malloc申请的空间可以用delete释放,那new申请的空间可以用free释放吗?

1.new和malloc的区别:
⚪前者是c++运算符,后者是c/c++标准库函数
⚪new自动计算分配空间的大小,malloc需要手工计算
⚪new是类型安全的,malloc不是
⚪new返回的是具体类型的指针,malloc返回的是void指针(必须进行强制类型转换)
⚪new由malloc+指针强制类型转换+构造函数组成
在这里插入图片描述

指针是内存的抽象表示;
new和malloc都非常慢,在高性能计算领域要减少它们的次数;

  1. malloc申请的存储空间能用delete释放吗? new申请的内存能用free释放吗?
    ⚪从编程纪律上说,是不可以, 因为 new 和delete 操作时, 是把对象当成一个类,要执行类的构造/析构函数。 而 malloc 和 free 则不会执行构造/析构。
    ⚪例子:在复杂类型A中, 会导致严重的问题,比如内存泄漏
    ⚪例外:但是当对象是简单类型时,确实是不会出错, 原因是 int,float 这种数字类型过于简单,没有复杂的构造/析构函数,因此此时 new 和 malloc是等价的
    在这里插入图片描述

第四题:C++程序的内存分区是怎么样的?

代码段:存储程序的二进制指令,即程序编译后的二进制代码
数据段:存储已被初始化的全局变量、静态变量
bss:存储未被初始化的全局变量、静态变量
stack(栈空间):存储函数参数和局部变量
heap(堆空间):malloc或new申请的内存
在这里插入图片描述
全局变量,静态变量是什么?
全局变量:全局可见,静态存储区,全局变量优先级低于局部变量(如果同名的话)
优点 :使用全局变量程序运行时速度会快一点,因为内存不需要再分配。
缺点 :使用全局变量会占用更多的内存,因为其生命期长。
不管加不加static,全局变量都是存储在静态存储区,都是在编译时分配存储空间的,两者只是作用域不同,全局变量可以使用extern拓展作用域,可以是整个工程,但static静态全局变量作用域仅限于本文件;
static修饰局部变量只改变生命周期,不改变作用域!

5.堆和栈的区别是什么?

在这里插入图片描述
1.管理方式:堆是需要手动开辟的
2.内存管理机制:可不记;但可以了解一下内存池的概念!
3.空间大小:只需要记住堆是几G,栈是几M,的数量级就可以了;
4.碎片问题;因为开辟空间的时候可能不是连续的,所以可能存在碎片;
在这里插入图片描述
5.生长方向
6.分配方式
7.分配效率:栈快很多,有专门的寄存器存栈地址,栈操作有专门的指令

内存池的作用和实现方式?
开辟一块大的内存,避免了频繁的使用new操作,提升性能;

6.什么是inline?作用?缺点?能写出具体代码体现用法吗?

1.inline定义: 函数A调用函数B的时候,直接把B函数体给替换过来
在这里插入图片描述
2.作用: 避免函数A调用B造成的栈空间(栈帧)创建(局部变量和函数参数)和释放开销(创栈->参数入栈->删栈)
3.缺点:当函数B的函数体比较复杂的时候,不宜inline,(再深入一点:此时会造成代码膨胀,造成CPU流水线前端fetch指令发生cache miss,降低性能)
cpu从cache中读取指令,如果函数体太大,cache缓存不够,cpu会从内存去读取,这样性能反而降低了;
在这里插入图片描述

7.C++ 函数和运算符的重载

重载的定义:某个函数和运算符可以有多个定义,参数个数、顺序、类型有一个不同即可,分别称为函数重载和运算符重载。编译器会根据实际调用传进去的实参在这多个定义中选择最合适的重载函数或重载运算符,称为重载决策。
类内函数重载:
在这里插入图片描述
类外函数重载:
在这里插入图片描述
运算符重载:
在这里插入图片描述

8. 说出resnet50的模型结构(包含哪些算子等等)?

conv2d,matmul,pooling,relu,batchnorm,softmax,mul等,要是能说出某种算子的优化方式就更好了,另外,加上一些算法idea上的思考也可以,比如conv2d可以通过转换成矩阵乘法来计算,算法名称叫做im2col,cuDNN内部就是这样计算conv2d
在这里插入图片描述

AI优化:1.计算图(算子融合);2.算子优化;3.执行时(内存池)

9.说出transformer encoder block的模型结构(包含哪些算子等等)?

gemm = mattul

10.C++类的拷贝构造函数有哪三种调用场景?什么时候会调用到拷贝赋值函数而不是

拷贝构造函数?能写出实例代码吗?

11. C++浅拷贝和深拷贝的认识?类的拷贝构造函数分别怎么写会触发浅拷贝和深拷贝?

12. 写出batchnorm和softmax的公式? Batchnorm你认为由哪些小算子构成的?

batchnorm和softmax在什么情况下计算结果可能会出现精度问题?为什么?怎么解决?

13.加速AI模型的推理速度,该从哪些角度去考虑?

宏观上:
1.计算效率:取决于硬件算力,以及计算的持续而不被打断
2.访存效率:取决于访存延迟和带宽
3.计算与访存相重叠
4.计算与通信相重叠

14. (上一题的细化)模型大小有四大评估指标:计算量,参数量,访存量,(峰值)内存占用

15. 如果让你加速resnet50的推理速度,你能想到哪些手段?

  1. GPU CUDA算子优化,GPU算子加速库(cuDNN,cuBLAS.etc),CPU算子加速库(oneDNN)
  2. int8量化压缩
  3. 算子融合
  4. 静态显存管理
  5. 运行时优化

举例说明对它们的理解
写出代码
持续更新中…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值