Skip to Content
C++语言导学(原书第2版)
book

C++语言导学(原书第2版)

by 本贾尼 斯特劳斯特鲁普
August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
Pearson
Content preview from C++语言导学(原书第2版)

13.6 分配器

标准库容器默认使用new分配空间。操作符new和delete提供了一种通用的自由存储空间(也被称为动态内存或堆),可以保存大小任意且生命周期可控的对象。这意味着时间和空间上的额外开销,而这种开销在很多特殊情况下是可以消除的。因此,标准库容器提供了在需要时安装具有特殊语义的分配器的机制。这一机制已被用来解决很多在意性能(如池分配器)、安全性(删除时清理内存的分配器)、每线程分配以及非一致内存架构(在特殊内存上分配,这种内存具有相匹配的指针类型)的应用。本书不会讨论这些重要但非常特殊的技术,这些技术通常也是高级技术。但是,我会介绍一个由现实世界问题激发的例子,它可用池分配器解决[Zubkov,2017]。

一个重要的、长时间运行的系统使用一个事件队列(参见15.6节),其中每个事件是一个vector,以shared_ptr传递。这样,一个事件的最后一个用户会隐式地删除它:

从逻辑角度看,这个版本工作得很好。它逻辑简单,因此代码健壮、可维护。不幸的是,这个版本会导致大量碎片。在16个生产者和4个消费者之间传递100000个事件后,会消耗超过6GB的内存。

碎片问题的传统解决方案是用池分配器重写代码。池分配器是一种管理单一固定大小对象的分配器,每次要为很多对象分配空间,而非为单个对象分配。幸运的是,C++对此提供了直接支持。池分配器定义在std的pmr(“多态内存资源”)子名字空间中:

现在,在16个生产者和4个消费者之间传递100000个事件之后,只会消耗少于3MB的内存。这有2000倍的性能提升!自然,真正使用的内存量(与碎片浪费的内存相对)并未改变。在消除碎片后,随着时间推移内存使用保持稳定,从而内存可以持续数月地运行。 ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.

Read now

Unlock full access

More than 5,000 organizations count on O’Reilly

AirBnbBlueOriginElectronic ArtsHomeDepotNasdaqRakutenTata Consultancy Services

QuotationMarkO’Reilly covers everything we've got, with content to help us build a world-class technology community, upgrade the capabilities and competencies of our teams, and improve overall team performance as well as their engagement.
Julian F.
Head of Cybersecurity
QuotationMarkI wanted to learn C and C++, but it didn't click for me until I picked up an O'Reilly book. When I went on the O’Reilly platform, I was astonished to find all the books there, plus live events and sandboxes so you could play around with the technology.
Addison B.
Field Engineer
QuotationMarkI’ve been on the O’Reilly platform for more than eight years. I use a couple of learning platforms, but I'm on O'Reilly more than anybody else. When you're there, you start learning. I'm never disappointed.
Amir M.
Data Platform Tech Lead
QuotationMarkI'm always learning. So when I got on to O'Reilly, I was like a kid in a candy store. There are playlists. There are answers. There's on-demand training. It's worth its weight in gold, in terms of what it allows me to do.
Mark W.
Embedded Software Engineer

You might also like

软件开发实践:项目驱动式的Java开发指南

软件开发实践:项目驱动式的Java开发指南

Raoul-Gabriel Urma, Richard Warburton
管理Kubernetes

管理Kubernetes

Brendan Burns, Craig Tracey
Python机器学习案例精解

Python机器学习案例精解

Posts & Telecom Press, Yuxi (Hayden) Liu

Publisher Resources

ISBN: 9787111633280