首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
02-23 14:59
门头沟学院 C++
滴滴 IOS客户端-C++ 一面
介绍 C++11 的一些新特性C++11 是现代 C++ 的分水岭,重点是语言层面支持并发、资源管理和泛型能力增强。面试里可以优先说这几类:语法简化、内存与对象语义、并发库、类型推导。常见可答内容是:auto 和 decltype、范围 for、右值引用与移动语义、nullptr、lambda、std::thread/mutex/condition_variable、smart pointer、unordered_map、constexpr、static_assert。如果只给一句总结,可以说 C++11 让“写对代码”和“写高性能代码”同时更容易。智能指针的实现原理本质是 RAII:把“资源...
查看11道真题和解析
点赞
评论
收藏
分享
今天 12:41
汤臣倍健_市场倍优生(准入职员工)
三棵树内推,三棵树内推码
三棵树ai测评行为能力1.请做一段自我介绍,说说你的教育背景,实习经验等,用时不超过5分钟。2.在你的学习和项目经历中,你似乎经常面临时间紧迫、任务繁重的挑战,能否分享一个具体的例子,描述一下在面对这些压力时,你如何管理和应对及最终达成目标的。3.你参与的这个项目最终的成果如何,你的成果得到了哪些方面的认可和表彰。4.回忆一下在你的学习或实习经历中,有一次你主动追求极致,把事情做到最好的例子,你当时究竟做了什么,为什么选择这么做,怎么证明这件事已经做到了最好。5.请回忆一个在团队工作里,你和团队成员没能达成一致意见的情况,当时你具体是怎么做的,说了什么去影响对方,最后结果是怎样的呢?6.从你的...
点赞
评论
收藏
分享
2025-12-29 23:01
江西财经大学 外贸业务员
求一个不把应届生当cs的城市
我真有点想骂人了
脑袋锈住了:
你这算啥,哥们中科院中强所硕士,本科211,叫我去干分拣,时薪20
点赞
评论
收藏
分享
01-13 16:55
已编辑
大连理工大学 运营
简历求拷打,投了好几个月,各种各样的岗位都试过,什么消息都没有
LeoHhhhh:
GPA写成GAP了
投了多少份简历才上岸
点赞
评论
收藏
分享
今天 15:16
莉莉丝游戏_2026届校招HRBP(准入职员工)
莉莉丝游戏内推,莉莉丝游戏内推码
【高工资和高福利】 🔸实习薪资本250/d,研300/d统一;校招社招薪资也很有竞争力 🔸Manner员工内购减10,自带杯再减5,能白嫖大多数饮品;新人入职day全天manner畅饮不限杯数(实习生入职也算,所以有新员工入职全部门可蹭 🔸有一整栋楼用来休闲娱乐,酒吧、猫屋、健身房、影音室、游泳馆、电竞房应有尽有,条件比市面大部分场所还好(所以员工是真的周末会来公司玩) 🔸每层配备卫生巾、常见药品,行政部门更换及时;超绝办公环境,升降桌、MacBookpro、人体工学椅是标配 🔸有班车从地铁到公司楼下(其实走过去也不远 【友好的企业文化】 🔸#莉莉丝游戏 企业文化是“简单真诚”,工...
莉莉丝游戏公司福利 767人发布
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
32分钟投了18家网申,效率如何?
2.0W
2
...
面试官视角聊聊:如何在AI浪潮中找到好工作?
7545
3
...
秋招以来的AI面经问题
6313
4
...
双非大厂实习
3710
5
...
拒绝无效的努力
3389
6
...
C++ MySql 常考面试题总结
3169
7
...
面试被问到“agent的记忆机制怎么设计”,该怎么回答?
2641
8
...
没算力,能搞大模型吗?
2619
9
...
润科通用Java实习
2517
10
...
二十多岁,谁不是一边混乱一边找答案
2330
创作者周榜
更多
正在热议
更多
#
xx岗简历求拷打
#
11843次浏览
124人参与
#
如何看待offer收割机的行为
#
1048227次浏览
6601人参与
#
开工第一帖
#
40368次浏览
783人参与
#
掌握什么AI技能,会为你的求职大大加分
#
9724次浏览
405人参与
#
有转正机会的小厂实习值得去吗?
#
10047次浏览
105人参与
#
机械人还在等华为开奖吗?
#
316272次浏览
1586人参与
#
携程求职进展汇总
#
891357次浏览
5903人参与
#
面试反问你会问什么
#
169370次浏览
1743人参与
#
联想求职进展汇总
#
335407次浏览
2224人参与
#
制造业的秋招小结
#
145025次浏览
2095人参与
#
被说“做题家”,你的反应是_____?
#
12646次浏览
165人参与
#
互联网回暖,腾讯要招5000人!
#
25263次浏览
597人参与
#
工作不开心辞职是唯一出路吗
#
10049次浏览
40人参与
#
远程面试的尴尬瞬间
#
328971次浏览
1918人参与
#
你最讨厌面试被问什么
#
10218次浏览
116人参与
#
金三银四,你有感觉到吗
#
695982次浏览
6096人参与
#
面试题刺客退退退
#
536065次浏览
7533人参与
#
哪些公司开春招了?
#
35350次浏览
210人参与
#
求职季如何保持心态不崩
#
213733次浏览
1468人参与
#
牛客租房专区
#
162350次浏览
1995人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务