孙笑川的叠 level
获赞
42
粉丝
29
关注
1
看过 TA
213
门头沟学院
2024
C#工程师
IP属地:四川
暂未填写个人简介
私信
关注
2023-11-01 15:54
门头沟学院 C#工程师
0 点赞 评论 收藏
分享
2023-10-28 13:27
门头沟学院 C#工程师
1.cpu是怎么读取内存的(不考虑dma的情况,通过中断读取)2.寄存器和cache哪个快(寄存器更快)3.寄存器,cache,内存,外存的关系(寄存器是cpu内部的存储单元,速度最快,程序运行时变量返回值等可以通过寄存器传递。cache是cpu和内存之间的高速缓存,用来保存一部分数据,方便cpu使用,提高性能。内存是程序运行的时候指令存放的地方,也是堆栈所存在的物理位置。外存即磁盘。)4.中断基本概念(外部中断由外设或硬件引起,内部中断由软件引起,也称为异常)5.什么是中断上下文:中断发生时寄存器和堆栈的信息6.中断函数特点(没有返回值,只能系统调用)7.中断函数里不能做什么(循环,复杂计算复杂逻辑,阻塞逻辑,延时等)8.中断向量表是什么(把中断号和中断函数对应起来放到内存中某个位置(例如地址0),从而形成了一个数组,在中断发生时查表从而调用中断函数。9.函数是怎么传递返回值的(数值型用寄存器返回例如arm的R0,x86的rax,如果是结构体返回值,在栈上生成变量,返回该变量的地址。)10.为什么返回一个指针后,使用该指针崩溃了(新手常犯的错误,由于返回值是子函数栈上的内容,因为是指针,本质上是把这个地址进行了返回,返回后子函数栈被销毁,该地址不再可用,出现访问非法内容。应当注意在子函数中指针到底指向了什么内容。而数值型的返回值本质上只是把数值进行了拷贝,自然不会有问题。)11.函数是怎么入参的(从右到左依次入栈,先赋值给寄存器,例如arm最多能用寄存器R0-R3传递4个参数,多余4个参数再直接压栈)12.如果函数只有一个参数需要入栈吗(可以不入,因为直接使用寄存器传值,但如果还有子函数调用,则需要把寄存器的值保存在栈中再进行调用)13.R14链接寄存器是干什么的(保存R15的值,子函数调用结束再把这个值赋给R15,这样就返回了此前的指令地址)14.pc指针指向哪里(下一条要执行的指令地址,鱿鱼arm的三级流水线机制,实际为当前指令地址+8)15.R13寄存器是什么(sp指针,指向栈顶地址)16.arm32一共有多少个寄存器(37个,但一般来说都是16个通用寄存器)17.nandflash和norflash的区别18.sram和dram区别19.一个核同时只能运行一个进程对吗(对)20.Mcu和Soc有什么区别
0 点赞 评论 收藏
分享
2023-10-28 12:36
门头沟学院 C#工程师
1.编译过程(预编译(展开宏定义,处理预编译指令生成.i文件),编译(把.c或.cpp编译汇编指令,生成.S文件),汇编(把汇编编译成二进制文件.o),链接(链接所有的.o文件和库文件,生成可执行文件)2.编译器优化(编译器会自动优化一部分代码,比如提高性能,减少冗余的代码内容,去掉不需要执行的代码等,对gcc用-O来开启优化,一般有3个优化等级,-O0表示不优化)3.gcc如何开启调试信息(编译时加上-g选项)4.gdb操作(gdb a.out进入gdb模式,run运行程序,b打断点,s单步调试,n单步调试进入子函数,thread_info查看线程,bt查看堆栈信息,f进入具体的栈帧,disassemble查看反汇编)5.linux如何查内存泄漏(valgrind等工具,或者自己加日志埋点)6.linux如何查程序崩溃(打断点或者打印大法或者gdb在崩溃后查coredump文件,找到堆栈信息,查看停在哪里)7.makefile和cmake(makefile是make用来编译的规则,但是由于跨平台性不足及编写难度偏大,于是有了cmake工具。语法较多不展开多说,本质上是先把Cmakelist.txt的文本内容通过cmake转为makefile,然后编译器再根makefile进行编译)8.动态链接和静态链接(动态链接是把依赖库单独放在一边,可执行文件中只有符号表没有二进制内容,因此是在程序执行时再去找二进制内容。静态链接是把所有依赖打包整合到可执行文件。动态链接的可执行文件小,更新灵活,可移植强,但需要运行时去搜索,性能相对差一点。静态链接缺点是可执行文件占用空间大,编译慢,优点是运行速度快,不依赖环境)9.C++的'extern C'的作用(让C++程序正确调用C代码,因为C++虽然兼容C语法,但编译器生成的函数符号是不一样的,可能导致链接出错或者执行时出现undefined reference等提示)10.编译时undefined reference出现原因(包含了头文件并调用了某个函数,但该函数没有被实现,只有声明没有定义。一般来说可能是没有对函数体进行编写,或者没有把对应的.c文件加入到编译工程。其次也可能是虚函数没有得到重写,找不到虚表等)11.C程序函数参数入栈顺序(从右到左依次入栈)
0 点赞 评论 收藏
分享
2023-10-28 11:50
门头沟学院 C#工程师
本来想写20条,发现自己太啰嗦,14条就提示超过文字上限了,我得精简一点15.什么是内存对齐(也叫字节对齐,cpu取内存时是按block,实际长度是跟字长有关,编译器会对结构体大小按内存对齐优化,可以用#pragma pack()设置)16.++i和i++的区别(从汇编看,++i是直接自增,相当于一条指令,i++需要临时变量存i,再i自增,所以++i性能比i++好。但现代编译器会自动优化,一般不会有性能差)17.什么是堆栈溢出,内存越界(数组超长或者栈小,局部变量数组过大)18.怎么理解数组传参退化为指针(形参数组当指针用)19.问号表达式,或运算符的截断性20.指针传递,取地址传递,值传递的区别。C++在嵌入式领域主要是应用开发,所以除了要理解C的八股,还需注意一些重点1.面对象编程的特点和面向过程的区别(封装继承多态)2.C++是怎么实现多态的(虚函数)3.什么是虚函数(virtual关键字修饰,父类中的虚函数可以在子类中重写,这样父类指针指向子类对象并调用该函数实际调用的是子类方法从而实现多态)3.虚函数如何实现多态(父类指针指向子类对象)4.求类的大小(sizeof(class))(除了考虑成员变量大小和字节对齐,再就是,如果类中存在虚函数,那么会隐藏一个指针指向类的虚表。因此还多出一个虚表指针的大小。)5.什么是虚表,虚表保存在哪里(如果类中有虚函数,就有一个虚表,保存函数接口,虚表编译时生成,保存在数据段,不占用类的空间)6.什么是抽象类,抽象类可以创建对象吗(如果虚函数后面有=0的字段,即为纯虚函数。如果类中有纯虚函数,称为抽象类,抽象类不能实例化)7..什么是菱形继承,怎么解决?8.什么是函数重载,可以返回值不同吗(返回值和函数名必须相同,但参数类型和个数可以不同)9.类成员public,protected,private的含义(public类外可以随意访问,protected子类能访问,private只有自己能访问,子类不能访问)10.友元能互相访问私有成员吗(可以)11.智能指针解决什么问题,原理(内存泄漏)12.为什么有shared_ptr还要weak_ptr(循环引用)13.空类大小(1字节,编译器分配用来占内存)14.类中的static成员变量(不属于某一个对象,在全局区)15.内联函数概念
0 点赞 评论 收藏
分享
2023-10-28 10:42
门头沟学院 C#工程师
无聊随便写写,都是高频考点,自己去理解吧。一般来说校招就喜欢问八股,因为绝大多数校招生都没啥项目拿得出手,大厂都要求基础好的学生,如果光会写算法题,不懂基础知识,是不符合要求的。第一部分C/C++基础1.static关键字的作用(函数,变量的效果)2.宏定义和函数区别,本质(文本替换,函数需要调用,需要入栈)3.const关键字的作用(只读)4.volatile关键字的作用(告诉编译器不要优化优化这个变量,不要把变量值缓存到寄存器或者cache,每次都直接去内存读取)5.char const *p和char * const p (变量前面是什么就是它的关键属性,例如const *p,首先*p表示一个指针,然后*p表示指向的内容,所以是指向的内容不变,即指向常量的指针。而*const p,首先是const p,表示p是一个常量,然后*const p表示p这个常量是一个指针,所以p的值不变且因为p是指针,那么就是p指向的地址不能变,但是这个地址的内容可以变)。同样的逻辑可以去理解指针数组和数组指针,指针函数和函数指针的关系。6.C程序的内存空间分布:代码段,数据段+bss段(也叫静态区),堆区,栈区7.未初始化的全局变量保存在哪里,已初始化的全局变量保存在哪里(bss段,数据段,或者说静态区)8.字符串常量保存在哪里(静态区)9.什么是bss段(未初始化的全局变量和静态变量都保存在bss段,其值为0)10.静态局部变量保存在哪里(初始化的在数据段,未初始化bss段)11.堆和栈的区别(内存空间的堆区和栈区,无关数据结构,超高频考点,自己理解)12.什么是内存泄漏(程序员主动申请的内存(调用malloc或者new)使用完毕后没有主动释放(free或者delete),这一块内存在这个进程存活期间就无法再次访问,造成资源浪费,如果刚好在循环中或者频繁调用,内存资源就会枯竭,无法正常运行程序,例如某些路由器,长时间使用,如果有内存泄漏就可能程序崩溃,但断电重启就恢复)13.什么是野指针(不知道指针具体指向内容的指针,鱿鱼不清楚具体指向,操作有风险,应当对指针赋初值,例如指向NULL)14.什么是空指针解引用(对某些指向结构体的指针取成员变量时鱿鱼不知道此前该指针已为NULL,导致对空指针解引用,引发程序崩溃,应当先判空再解引用)
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务