当前位置: 首页 > article >正文

Momenta中间件C++一面-面经总结

1、C++智能指针?

1.auto_ptr 垃圾已被废弃 c++98 使用困惑
2.shared_ptr 多个指针指向同一个对象 引用计数为0才释放对象
3.weak_ptr 搭配shared出现的 不增加计数 避免循环引用 不直接访问对象
4.unique_ptr 独占所有权 一个对象有一个所有者

2、unique_ptr有什么特性,底层实现是怎样的?

1.独占所有权 不能赋值给另一个
2.但是支持移动语义 可以把所有权让给另一个 用move
3.自动释放资源 RAII (这个是智能指针都要说的)
4.效率高 只有一个指针 也没有引用计数 轻量

底层实现:
就是个模板类,可以管理动态分配的对象,template的typename指定管理的资源的类型。
构造函数时默认构造函数,析构函数来确保他离开作用域就删除器。
禁止拷贝构造 禁止拷贝赋值运算符

unique_ptr(const unique_ptr&) = delete;  // 禁止拷贝构造
unique_ptr& operator=(const unique_ptr&) = delete;  // 禁止拷贝赋值

但是支持移动语义,可以移动构造 可以移动赋值 move(从另一个 unique_ptr 中“偷走”指针,将原来的指针置为空。)

3、unique_ptr是怎么保证无法赋值构造的?

这是通过”删除的函数“:(=delete)禁止操作
工作原理:
1.删除拷贝构造函数 编译器就“use of deleted function”
2.删除拷贝赋值运算符
虽然不能拷贝 但是可以移动语义 可以转移 而不违反独占所有权

4、shared_ptr怎么实现的,引用计数是什么数据格式?

本质都是模板类 和刚才的unique_ptr是一样的。但是shared这个模板类中有引用计数和控制块
shared_ptr 主要通过引用计数来管理资源的生命周期。每当一个新的 shared_ptr 被创建并指向某个资源时,引用计数会增加;每当一个 shared_ptr 被销毁或不再指向资源时,引用计数会减少。当引用计数变为 0 时,资源会自动释放。

控制块:shared_ptr 通常管理一个单独的控制块,该块包含了:
1.资源的指针(即被 shared_ptr 管理的对象)。
2.引用计数(用于记录有多少 shared_ptr 指向同一资源)。
3.弱引用计数(用于 std::weak_ptr)。
4.删除器(自定义删除方式)。

引用计数就是整型的变量 atomic保证线程安全性(原子操作保障)
原子操作能够确保在多个线程同时修改引用计数时不会产生竞争条件,防止引用计数错误。

引用计数如何管理资源的?
在这个模板类的析构函数中,如果创建新的shared指向同一个资源的时候,引用计数+1,但是离开作用域或者销毁,就会-1.当等于0的时候,就释放资源,销毁控制块。

5、引用计数的线程安全怎么保证的,底层怎么实现?

1 原子操作 atomic来保证不会出现竞争的情况。
2 内存模型:C++ 的原子操作提供了几种内存序模型,例如 memory_order_relaxed、memory_order_acquire 和 memory_order_release,以控制操作的内存可见性顺序。shared_ptr 通常使用 memory_order_acquire 和 memory_order_release 来确保引用计数的线程安全,同时减少内存屏障的开销。

6、静态链接和动态链接具体有什么区别,各有什么优势?

静态链接是在编译或链接阶段,将所需的库文件直接整合到可执行文件中。在最终生成的可执行文件中,库的代码已经成为其中的一部分不需要额外的库文件来运行。
动态链接是在运行时,将所需的库文件动态加载到内存中,并链接到程序的执行过程中。库文件不包含在可执行文件中,而是存储在外部,程序在运行时通过操作系统加载所需的共享库(如 .dll、.so 文件)。

速记口诀:时间、地点、大小、难易、启动速度

7、动态链接库被加载到什么位置,这个位置是怎么寻址的?

加载到虚拟内存 寻址得看操作系统和库文件的格式。

8、虚拟内存里文件映射区在什么位置,位置信息是怎么维护的?

望文生义,就是文件的内容映射到进程的虚拟地址空间,使得文件的内容也能像访问RAM一样被读取或者修改。肯定没有固定的地址,因为受操作系统和内存管理单元的决定。还有地址空间布局随机化防止内存攻击。

位置信息由操作系统和内存管理单元共同决定。操作系统通过内核的数据结构页面表(Page Table)来维护虚拟内存区域的位置信息。

9、进程间有哪些通信方式?

无名管道:父子进程数据流传输
命名管道:任意进程数据流传输
消息队列:多个进程有序、异步通信 支持同步
信号量:进程同步和共享资源的访问控制
套接字:网络通信和本地进程间通信
共享内存:高速的数据共享

10、共享内存怎么创建映射的,怎么知道映射内存的地址?

特点:共享内存是进程间通信中最快的一种方式,它允许多个进程直接访问相同的内存区域。
实现:操作系统分配一个共享内存段,多个进程通过映射到相同的内存区域实现通信。

创建映射是靠mmap函数
调用 mmap 函数后,它会返回映射区域的起始地址。

11、共享内存的互斥访问具体怎么实现,锁和信号量怎么在两个进程间共享?

使用互斥锁(Mutex)和信号量(Semaphore)进行同步。

互斥锁(mutex)是一种同步机制,用于保证同一时刻只有一个线程(或进程)能够访问共享资源。使用互斥锁可以防止多个进程同时对共享内存进行修改,从而保证数据一致性。

信号量是一种同步机制,用于控制访问共享资源的数量。信号量可以用于同步多个进程对共享内存的访问。

talk is cheap show me the code
岛屿数量


http://www.kler.cn/a/323625.html

相关文章:

  • 探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力
  • 【数据结构】线性表——栈与队列
  • Java I/O(输入/输出)——针对实习面试
  • Go 语言中,golang结合 PostgreSQL 、MySQL驱动 开启数据库事务
  • Ps:OpenColorIO 设置
  • 基于java的航空机票预定管理系统
  • Java集合(下)
  • 这条挣钱的路,离我好遥远啊
  • CSS05-复合选择器
  • 鞋类分类系统源码分享
  • 胡超:引领中美文化、创意与能源合作的关键人物
  • 【计算机网络 - 基础问题】每日 3 题(二十五)
  • MurmurHash 算法
  • 众数问题,
  • JAVA并发编程系列(11)线程池底层原理架构剖析
  • 【春秋云境】CVE-2024-23897-Jenkins 2.441之前版本存在任意文件读取漏洞
  • RuoYi若依框架学习:多环境配置
  • 电子秤PCBA方案应用解决方案设计
  • Java面试:ArrayList 和 LinkedList 的区别是什么?谈谈你对ArrayList和LinkedList的理解
  • 500. 键盘行 哈希表 力扣 Python 难度指数:3
  • JavaScript 定时器与动画基础
  • DAY80服务攻防-中间件安全HW2023-WPS 分析WeblogicJettyJenkinsCVE
  • 旧衣回收小程序搭建,开发功能优势
  • CORDIC算法笔记整理
  • 全局中断总开关位与各个中断源对应的寄存器使能位开启顺序
  • Vscode把全部‘def‘都收起来的快捷键