面试题答案
一键面试1. 内存池技术
- 原理:预先分配一块较大的内存区域作为内存池。当需要创建对象时,直接从内存池中分配内存,而不是调用
new
从堆中申请。当对象销毁时,将内存归还到内存池,而不是调用delete
释放回堆。这样避免了频繁调用new
和delete
带来的额外开销(如系统调用、内存元数据管理等),同时减少了内存碎片的产生,因为内存是按块统一管理的。 - 适用场景:适用于对象创建和销毁频率较高,且对象大小相对固定的场景。例如在网络服务器中处理大量相似的网络连接请求对象时,就可以使用内存池技术。
2. 智能指针的合理使用
- 原理:
std::unique_ptr
:独占式智能指针,对象的所有权唯一。当std::unique_ptr
离开其作用域时,会自动调用delete
释放其所指向的对象。它通过移动语义来转移所有权,避免了不必要的拷贝。std::shared_ptr
:共享式智能指针,通过引用计数来管理对象的生命周期。多个std::shared_ptr
可以指向同一个对象,当引用计数降为0时,对象会被自动释放。这种方式可以方便地在不同的代码模块之间共享对象,而不用担心内存泄漏。std::weak_ptr
:弱引用智能指针,它不增加对象的引用计数。主要用于解决std::shared_ptr
的循环引用问题。当std::shared_ptr
所指向的对象被释放后,std::weak_ptr
会自动变为空指针,可以通过lock()
方法尝试获取一个有效的std::shared_ptr
。
- 适用场景:
std::unique_ptr
:适用于对象只在一个地方被使用,并且在作用域结束时需要自动释放的场景,比如函数内部创建的临时对象。std::shared_ptr
:适用于需要在多个地方共享对象的场景,例如在多个模块之间传递一个公共资源的指针。std::weak_ptr
:当存在可能导致循环引用的场景,如双向链表中的节点,就需要使用std::weak_ptr
来打破循环。
3. 对象复用
- 原理:对于一些对象,在其生命周期内,当它们不再被使用时,不是直接销毁,而是将其标记为可复用,并重置其状态。当下次需要创建新对象时,优先从可复用对象列表中获取,而不是创建新的对象。这样减少了对象创建和销毁的次数,从而提高性能。
- 适用场景:适用于对象的创建和初始化开销较大,且对象在一段时间内可能会被反复使用的场景。比如游戏开发中,频繁出现和消失的游戏对象(如子弹、怪物等)就可以采用对象复用策略。
4. 减少对象创建的频率
- 原理:尽量避免不必要的对象创建。例如,在事件驱动系统中,如果某些事件处理逻辑不需要每次都创建新的对象来处理,可以考虑使用单例模式(对于全局唯一且频繁使用的对象)或者在初始化阶段创建一定数量的对象并缓存起来,根据需要进行复用。
- 适用场景:适用于对象创建开销大,且对象使用场景较为固定的情况。比如日志记录模块,在整个应用程序运行期间可能需要频繁记录日志,如果每次记录都创建新的日志对象就会造成性能浪费,采用单例模式可以避免这种情况。