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
岛屿数量