C++基础基础基础杂谈,面试理解,看看就行,有不对欢迎指出

20240321 面试

今天面了一家公司,遇到几个之前没有遇到的问题,回答得不是特别好,对此进行归纳整理,顺道吐槽一下,最近西安的公司是真的一言难尽啊,有好的公司推荐下小弟我。

        联系方式 19105695348

1、多线程

对多线程有了解吗,讲一下多线程对数据的处理。

       (扯得有点杂,因为不知道怎么系统回答这个问题。)

        首先,讲多线程就要提到多进程。进程是操作系统调度的基本单元,进程的模型称为PCB,里面包括虚拟内存模型,进程调度优先级等信息(回答的不好,详见下图,图片来源:五分钟扫盲:进程与线程基础必知 - 知乎 (zhihu.com))。对于操作系统来说,对进程进行调度和管理,对于多任务来说,可以使用多进程,但是进程的调度对于性能损耗来讲过于庞大,并且可能某些微形任务,无需使用进程进行调度,由此衍生出来线程。

        线程是轻量级的,一个进程包含多个线程,进程对线程进行管理,线程有自己的局部变量,栈空间,同时线程间共享虚拟内存模型,对于多个线程间共享数据,需要考虑到数据的一致性访问问题,若存在多个线程,且存在一个线程对数据进行写操作,可能会导致其他线程同时写或读错误,导致数据不一致问题。

        线程间对于共享数据,存在同步和互斥,解决线程间对数据访问的安全问题,可以使用锁、条件变量、信号(signal)解决。(面试官提到内核的 handler_route,不知道是社么东西,百度搜索说是Android的,不晓得是不是同一个东西;还问我有没有其他的东西,我是暂时不知道了)

补充一下:进程间通信方式和写时拷贝(想要了解的可以看一下之前的文章Linux 系统编程--进程_线程的pcb是否相同-CSDN博客

        1)、管道        2)、共享内存        3)、消息队列        4)、信号量        5)、Socket

进程和子进程的共享数据(写时拷贝)简单说一下:

        父进程通过 fork() 开辟子进程时,子进程和父进程共享父进程的PCB,在进程需要进行写操作修改时,会先在自己的内存模型开辟一段空间,将需要修改的数据建立映射关系,然后再属于子进程自己的PCB上进行数据更改。

2、指针和数组(一般都是问指针和引用,这个之前没有系统整理过回复的不是特别好)

        C语言的对象有三种分配方式,静态区、栈、堆

        对于数组而言,一般讲的是栈数组,比如在函数内部使用 int a[10] = {1,2,3,4,5....}; 定义一个数组a,a由编译器进行管理,在函数调用结束后,a的生命周期随之结束;对于指针而言,一般是使用 malloc 和 new 向操作系统申请堆空间的时候,会用到指针,申请到的空间的位置就是在堆上,然后返回给指针变量,生命周期在申请时开始,随进程结束,因此我们需要及时使用 delete 和 free 进行内存释放,防止内存泄漏。

        对于运算符sizeof而言,指针的大小随操作系统,32位操作系统对应4个字节,64位操作系统对应8个字节,且数组+1,跨度为整个数组的长度,即 int a[10],int * b = a + 1,那么 b - a = 40(32位系统),int a* = new int(10),int * b = a + 1,那么 b - a = 1;

        数组的首元素的地址,其实就是一个指针。想到一个题外话,说栈为什么是高地址向低地址增长的? 运用数组可以比较巧合的解释,栈的数据结构是后进先出,数组是返回一个指向首地址的指针,申请一段内存,返回首地址,刚好对应栈顶。。。

       当然对于数组而言,我们也可以使用指针数组,指针指向堆内存,但是这个时候数组是存储在栈上的(面试官纠正说是在堆上的,我试过在函数内部声明一个指针数组和普通数组,发现连个数组的首地址相差不多,应该都是栈上的,只不过里面存储的指针,可以将指针指向堆内存)

        对于指针而言,指向数组首地址时,可以使用指针+1,即指向数组的第二个元素。

最后问了一个 1M 的空间,使用指针还是使用数组呢,我理解错了,以为考察堆和栈的区别,就说,对于1M的空间,可以使用栈进行管理,毕竟安全,不用手动进行管理内存,在一个栈的访问效率较高。其实就是字面意思,问我指针还是数组,我回答的指针,搞不灵清,好像没有特别大的区别吧,数组底层也是用的指针。

3、标准的C是不支持函数重载的,怎么实现

        这个我记得C是支持重载的, 就说没有思路(平常用的都是IDE,VISUAL STUDIO,里面使用的cpp的编译器,纯C的编译器接触较少,没有怎么考虑到)。面试官打算过了,我问了一嘴,提示我说函数指针,我一下秒懂。用函数指针数组呀!然后巴拉巴拉开始讲,C的文件隔离的,使用静态函数,将函数名限定在本文件内,然后声明一个全局的函数指针数组变量,将静态函数放到全局的函数指针数组变量中。但其实是不严谨的。仔细思考一下,静态的函数指针应该放到静态的函数指针数组变量(验证了一下可行的,unbelievable)

        拓展一下,c里面的函数编译后的样子,在看看cpp函数编译后的样子,就知道C不支持函数重载了。

        再扩展一下,使用宏啊!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值