首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
rayyeo
门头沟学院 C++
关注
已关注
取消关注
存
@Hcoco:
面试真题 | 海康威视
海康威视 1.函数指针和指针函数区别 1.定义的差异 函数指针:函数指针的定义涉及到函数的地址。例如,定义一个指向函数的指针 int (*fp)(int),这里 fp 是一个指针,它指向一个接受一个整数参数并返回整数的函数。 指针函数:指针函数是指其返回类型为指针的函数。例如,int* f(int) 表示一个函数 f,它接受一个整数参数 并返回一个指向整数的指针。 2.用法的不同 函数指针:在编程中,函数指针主要用于指向和调用不同的函数,特别是在实现策略模式、回调函数或事件驱动程序时。这使得代码更加模块化和可重用。(挂钩子) 指针函数:指针函数通常用于在函数内部动态分配内存,并将其地址返回给调用者。这在处理大型数据结构或提供灵活的内存管理方案时非常有用。 3.应用场景的区别 函数指针:它们广泛应用于实现接口、回调机制以及函数作为参数的情况。例如,在C标准库中的 qsort 函数使用函数指针来定制排序行为。 指针函数:主要用于当函数需要返回多个值或大型数据结构时。例如,在操作字符串或复杂数据结构时,指针函数可以有效地返回所需的数据。 4.语法结构的差异 函数指针:在定义函数指针时,重点在于指针的位置和它指向的函数类型。正确的语法和理解函数的签名是关键。 指针函数:其定义类似于常规函数,只是其返回类型为指针。理解如何声明返回指针的函数并确保正确的内存管理是使用指针函数的关键。 2.进程与线程的区别 0、什么是线程? 线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。 线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。 在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。 1、根本区别 进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 2、从属关系不同 进程中包含了线程,线程属于进程。一个进程可以有很多线程,每条线程并行执行不同的任务。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 3、开销不同 进程的创建、销毁和切换的开销都远大于线程。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。 4、拥有资源不同 每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。进程是资源分配的基本单位。 所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。 另外,进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。 当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。 5、控制和影响能力不同 子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。 与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。 6、CPU利用率不同 进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。 在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。 在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。 3.malloc和new的区别 new与malloc的10点区别:https://www.cnblogs.com/QG-whz/p/5140930.html 1. 申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。 而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。 那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。 特别的,new甚至可以不为对象分配内存!定位new的功能可以办到这一点: new (place_address) type place_address为一个指针,代表一块内存的地址。当使用上面这种仅以一个地址调用new操作符时,new操作符调用特殊的operator new,也就是下面这个版本: void * operator new (size_t,void *) //不允许重定义这个版本的operator new 这个operator new不分配任何的内存,它只是简单地返回指针实参,然后右new表达式负责在place_address指定的地址进行对象的初始化工作。 2.返回类型安全性 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。 而malloc内存分配成功则是返回void *** ,需要通过强制类型转换将void*指针转换成我们需要的类型**。 类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图方法自己没被授权的内存区域。关于C++的类型安全性可说的又有很多了。 3.内存分配失败时的返回值 new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL; malloc分配内存失败时返回NULL。 在使用C语言时,我们习惯在malloc分配内存后判断分配是否成功: int *a = (int *)malloc ( sizeof (int ));if(NULL == a){ ...}else { ...} 从C语言走入C++阵营的新手可能会把这个习惯带入C++: int * a = new int();if(NULL == a){ ...}else{ ...} 实际上这样做一点意义也没有,因为new根本不会返回NULL,而且程序能够执行到if语句已经说明内存分配成功了,如果失败早就抛异常了。正确的做法应该是使用异常机制: try{ int *a = new int();}catch (bad_alloc){ ...} 如果你想顺便了解下异常基础,可以看http://www.cnblogs.com/QG-whz/p/5136883.htmlC++ 异常机制分析。 4.是否需要指定内存大小 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。 class A{...}A * ptr = new A;A * ptr = (A *)malloc(sizeof(A)); //需要显式指定所需内存大小sizeof(A); 当然了,我这里使用malloc来为我们自定义类型分配内存是不怎么合适的,请看下一条。 5.是否调用构造函数/析构函数 使用new操作符来分配对象内存时会经历三个步骤: 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。 第三部:对象构造完成后,返回一个指向该对象的指针。 使用delete操作符来释放对象内存时会经历两个步骤: 第一步:调用对象的析构函数。 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。 总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。而malloc则不会。如果你不嫌啰嗦可以看下我的例子: 6.对数组的处理 C++提供了new[]与delete[]来专门处理数组类型: A * ptr = new A[10];//分配10个A对象 使用new[]分配的内存必须使用delete[]进行释放: delete [] ptr; new对数组的支持体现在它会分别调用构造函数函数初始化每一个数组元素,释放对象时为每个对象调用析构函数。注意delete[]要与new[]配套使用,不然会找出数组对象部分释放的现象,造成内存泄漏。 至于malloc,它并知道你在这块内存上要放的数组还是啥别的东西,反正它就给你一块原始的内存,在给你个内存的地址就完事。所以如果要动态分配一个数组的内存,还需要我们手动自定数组的大小: int * ptr = (int *) malloc( sizeof(int)* 10 );//分配一个10个int元素的数组 7.new与malloc是否可以相互调用 operator new /operator delete的实现可以基于malloc,而malloc的实现不可以去调用new。下面是编写operator new /operator delete 的一种简单方式,其他版本也与之类似: void * operator new (sieze_t size){ if(void * mem = malloc(size) return mem; else throw bad_alloc();}void operator delete(void *mem) noexcept{ free(mem);} 8.是否可以被重载 opeartor new /operator delete可以被重载。标准库是定义了operator new函数和operator delete函数的8个重载版本: //这些版本可能抛出异常void * operator new(size_t);void * operator new[](size_t);void * operator delete (void * )noexcept;void * operator delete[](void *0)noexcept;//这些版本承诺不抛出异常void * operator new(size_t ,nothrow_t&) noexcept;void * operator new[](size_t, nothrow_t& );void * operator delete (void *,nothrow_t& )noexcept;void * operator delete[](void *0,nothrow_t& )noexcept; 我们可以自定义上面函数版本中的任意一个,前提是自定义版本必须位于全局作用域或者类作用域中。 太细节的东西不在这里讲述,总之,我们知道我们有足够的自由去重载operator new /operator delete ,以决定我们的new与delete如何为对象分配内存,如何回收对象。 而malloc/free并不允许重载。 9. 能够直观地重新分配内存 使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。 new没有这样直观的配套设施来扩充内存。 10. 客户处理内存分配不足 在operator new抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定
点赞 17
评论 5
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-16 15:41
重庆大学 Java
腾讯云智运营开发一面
今天突然给我打电话约面下午,人都傻了,结果寄,我还是太菜了,哎,还是无手撕,这算kpi吗?感觉问得还是挺多的,但只有40分钟。面经一开始我就晕了,叫我用英文自我介绍1.英文自我介绍(面试官看我过了六级就让我用英文自我介绍,没准备过啊喂)2.介绍项目3.熔断机制(感觉还是不该写微服务的,但不写没面试啊)4.ES索引是怎么设置的(好像答错了,答成ES用的啥索引了,答了倒排索引)5.然后开始问我竞赛?(我了个骚刚,没见过问竞赛干了啥的啊)6.linux和docker常用命令(然后逮着linux问(我不都写了了解吗))7.linux怎么解决网络问题8.linux怎么抓包9.mysql mvcc10.m...
腾讯云智研发一面169人在聊
查看17道真题和解析
点赞
评论
收藏
分享
05-12 13:05
沈阳理工大学 Python
简历求拷打
双非二本,没学Java感觉与后端无缘了啊,Python是写过完整项目的,C++除了当初为了考证学的Qt之后就只在刷算法题的时候先用Python快速过一遍然后再写一遍C++版本的时候用到了,求佬们指条方向
xwqlikepsl:
转行做测试得了,Python不能作为主要开发语言
点赞
评论
收藏
分享
05-06 08:51
华北理工大学 后端
求助🥹投了几百家一个面试都没有
做了外卖和点评,是项目问题吗,太难了一个面试没有😭
求面试求offer啊啊啊啊:
把华北改为华南再试一试,应该就没啥问题了。改完可能都不用投,别人主动联系了。
点赞
评论
收藏
分享
昨天 09:25
门头沟学院 前端工程师
安克创新内推 安克创新内推码
安克创新极致产品创造者训练生(硬件产品经理)春招提前批招聘开启 安克希望搭建一个互相激发的创造者乐园,并寻找和培育一批有好奇心、有创造力、坚持独立思考的未来创造者,一起打造极致产品、成为全球消费者热爱的品牌。加入我们,一起努力以创新之名,为世界带来新的精彩体验! 项目亮点 -龙头岗位:入职即接触公司核心业务和前沿战略,参与千万级项目 -优先轮岗:多品类/多价值链机会,每2-3年主动分配新机会,不断拉高职业天花板 -专项培养:定制化培养体系和成长路径踏上极速成长快车道 -全球视野:定期出国洞察海外用户,打造全球用户热爱的产品 发展路径:入职即参与千万级项目,2-3年独立打造爆款产品 培养体系: ...
投递安克创新 Anker等公司6个岗位 >
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
Java后端开发需要理解和背的八股文整理
5.3W
2
...
“我想了想,你去哪我都想和你在一起”
2.3W
3
...
💌【520限时活动公告】牛爱网高甜营业!你的恋爱通关秘籍已送达~
1.9W
4
...
5月16日早上莫名被美团捞起来了
1.5W
5
...
搬砖日常。不如跑路
1.2W
6
...
记录一下这两个月面试以来遇到的手撕题
1.1W
7
...
在华为od干的要猝死了
9926
8
...
离开这座让我伤心的城市了💔,希望以后一切顺利吧!#补录# #裁应届生# #捡漏# #minimax#
8968
9
...
大二,想要去实习(计算机专业)
5808
10
...
【双非本】上岸字节后端 | 接单 | 奖学金 | 做自媒体,分享下主包的大学四年 ✨🎓
5682
创作者周榜
更多
正在热议
更多
#
牛油的搬砖plog
#
29889次浏览
149人参与
#
这些公司卡简历很严格
#
26853次浏览
117人参与
#
一人一个landing小技巧
#
25700次浏览
485人参与
#
大学最后一个寒假,我想……
#
30991次浏览
309人参与
#
正在实习的你,有转正机会吗?
#
371937次浏览
2863人参与
#
写简历别走弯路
#
723785次浏览
7881人参与
#
我在牛爱网找对象
#
180586次浏览
1377人参与
#
运营人求职交流聚集地
#
128050次浏览
962人参与
#
硬件兄弟们 甩出你的华为奖状
#
100561次浏览
675人参与
#
520告白墙
#
23884次浏览
380人参与
#
求职你最看重什么?
#
68055次浏览
381人参与
#
电网笔面经互助
#
31839次浏览
317人参与
#
找工作的破防时刻
#
28197次浏览
425人参与
#
面试被问第一学历差时该怎么回答
#
123426次浏览
769人参与
#
为什么那么多公司毁约
#
163969次浏览
1230人参与
#
运营每日一题
#
68009次浏览
657人参与
#
数字马力求职进展汇总
#
171964次浏览
1454人参与
#
查收我的offer竞争力报告
#
177245次浏览
1084人参与
#
腾讯音乐求职进展汇总
#
86614次浏览
487人参与
#
我发现一个规律
#
3774次浏览
34人参与
牛客网
牛客企业服务