首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
12-18 10:20
已编辑
合肥工业大学 运营
27届找数据分析日常实习,简历求拷打
想在年后找日常和暑期实习,不知道简历怎么改才好,求大佬拷打。
点赞
评论
收藏
分享
12-17 11:51
汤臣倍健_市场倍优生(准入职员工)
汤臣倍健内推,汤臣倍健内推码
本人情况 加入汤臣倍健已经有一周了,是健力多品牌的产品实习生,主要参与健力多产品的商品化和上市过程。 工作时间 朝九晚五!朝九晚五!朝九晚五!这是我最喜欢小汤的地方 每当其他公司的实习生还在工作开会时,我已经喜提包包准备回家了,别提有多爽了 而且!!!居然不打卡!!这意味着实际工作的时间非常弹性!比如我们组就是默认早上10点上班,相当于朝十晚五了 工作氛围 超级好!!同事们都特别友善!!特别特别特别喜欢我的mentor不要求我加班,给我很大的工作自主性,注重对我能力的培养,还特别有同理心,有耐心!!!我上辈子哪修来的福分啊还遇到了两个很友好的实习搭子,已经在约逛街了实习强度 总体来说强度不大,...
汤臣倍健公司氛围 406人发布
点赞
评论
收藏
分享
11-13 14:37
门头沟学院 Java
27java求建议
27届Java后端,11月开始投实习,到现在只有1面,是项目太水了么,加一个简单的ai大模型相关的项目可以么?谢谢各位佬😖
程序员花海:
实习经历看起来太简单了,没有啥好问的,两个项目还行
点赞
评论
收藏
分享
10-25 18:35
华东交通大学 Java
26届双非本,11月补录还有机会吗😭
hwwhwh:
同双非,有大厂实习其实也没啥用,主要看运气,等就行了
点赞
评论
收藏
分享
12-19 22:06
武汉大学 Java
20251219【携程】面试算法真题(共1题)
题目1:最长连续序列
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
读研还是本科就业?
1997
2
...
用了几年 AI 辅助编程,发现自己逐渐废了,我该怎么办
1658
3
...
数字马力
1383
4
...
给26届校招拿到大厂Offer的人一句忠告!
1184
5
...
双非硕后端秋招情况(准备春招版)
1116
6
...
牛爷爷们帮忙选一下offer
1025
7
...
腾讯云智timeline
919
8
...
秋招总结
879
9
...
任何人都可以拥有的超优秀实习经历
829
10
...
美团一面凉经
800
创作者周榜
更多
正在热议
更多
#
2025年终总结
#
123767次浏览
2078人参与
#
实习简历求拷打
#
16532次浏览
194人参与
#
作业帮求职进展汇总
#
83969次浏览
554人参与
#
秋招被挂春招仍然能投的公司
#
7754次浏览
108人参与
#
实习要如何选择和准备?
#
128543次浏览
1486人参与
#
外包能不能当跳板?
#
54278次浏览
256人参与
#
诺瓦星云求职进展汇总
#
233509次浏览
1736人参与
#
mt对你说过最有启发的一句话
#
38975次浏览
454人参与
#
公司情报交流地
#
126682次浏览
1227人参与
#
为了找工作你花了哪些钱?
#
74883次浏览
361人参与
#
你觉得机械有必要实习吗
#
69828次浏览
485人参与
#
投格力的你,拿到offer了吗?
#
153423次浏览
822人参与
#
一起聊美团
#
307638次浏览
1767人参与
#
什么是优秀的实习经历
#
9368次浏览
226人参与
#
摸鱼被leader发现了怎么办
#
103813次浏览
659人参与
#
京东开奖
#
632052次浏览
3180人参与
#
秋招特别不鸣谢
#
16589次浏览
186人参与
#
考研失败就一定是坏事吗?
#
202590次浏览
1387人参与
#
选实习,你更看重哪方面?
#
15277次浏览
230人参与
#
安克创新求职进展汇总
#
62474次浏览
541人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务