没有合适的资源?快使用搜索试试~ 我知道了~
首页类型化缓存(III): 拷贝/移动对象与低能分配器
类型化缓存(III): 拷贝/移动对象与低能分配器
0 下载量 121 浏览量
更新于2024-07-15
收藏 184KB PDF 举报
本文档深入探讨了泛型编程中的"类型化缓存(III)"概念,这是一种轻量级且灵活的数据结构,专为在性能至关重要时提供高效连续对象数组而设计。它介于基础内置数组和复杂的标准模板库(STL)容器如std::vector之间,允许程序员在需要时创建易于扩展和管理的对象集合。 在前文[1]中,作者重点讲解了如何通过优化内存操作来提升buffer操作的性能,包括内存填充和复制。然而,这篇文档的焦点转向了对象的拷贝和移动,而非单纯的数据操作。这表明类型化缓存不仅仅是一个存储空间,它还支持动态对象的生命周期管理。 文章中提到的一个关键概念是“低能分配器(Allocator)”,这是C++内存管理策略的一部分。作者以其在聚会中的经历为例,提及STL的分配器设计常常被批评为策略设计的失败案例。实际上,C++内存管理的历史可以追溯到C语言,C提供的malloc、free和realloc函数虽然直观,但在功能上并不全面,例如realloc函数的功能过于复杂,可能导致代码不易理解和维护。 文中展示了一个简化的realloc实现,它需要处理多种边界条件,并在内存扩充或需要移动数据时分别执行不同的操作。这个例子展示了内存管理的复杂性以及在设计类型化缓存时需要考虑的细节。通过使用适当的分配器策略,类型化缓存可以更好地适应不同场景的需求,减少内存分配和释放的开销,从而提高程序性能。 本文旨在提供一种更加细致且面向对象的方法来处理内存管理,强调了类型化缓存在实际编程中的灵活性和高效性,尤其是在涉及对象拷贝和移动的场合。这对于那些追求性能优化的开发者来说,是一个重要的学习资源,有助于他们构建更复杂的数据结构并理解如何有效地利用内存策略。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/15048247/bg4.jpg)
{
buf[i] = GetSomeString(i);
}
....
Buf.reserve(buf.size() + 1000);
现在无论你是否使用Mallocator,有时候你不得不需要经历分配——拷贝——摧毁的
循环。假定上例发生这个动作,对reserve调用就包括了移动1,000,000个字符串对
象。在C++中,移动对象的做法类似于那些基本的转移方法:在另一处克隆对象然后
摧毁源对象。
克隆所有这些字符串可能开销庞大——如果字符串不是引用记数的话。这比只拷贝
它们所在的内存要大许多——这是非常可能的[9]——这样reserve就带来了许多不必要
的工作,reserve分配一个新内存块,拷贝每个字符串到新块,然后最终,摧毁老块中
的字符串。
但为什么当我们实际上只需要轻松地重新放置对象时却做了所有这些拷贝动作呢?
我们只需要告诉一个字符串:“嗨,在内存里有你一个新位置,请自己重新就位。”因
为字符串的老位置已经没用了(不管怎样都会被丢弃),字符串可以只要快速拷贝其
内部指针到目标内存块。
我们不需要想很久就能明白象这样做需要把移动作为一个基本操作,而不同于拷
贝,拷贝是复制对象。移动没有复制,对象总数保持不变。在缺乏移动这个概念的情
况下,我们在C++中通过克隆然后摧毁原对象来实现它。我们需要做得更聪明些。
有许多方法可以实现移动。最简单的一个可以用函数
template <class T> void Move(T* src, void* dest);
但这样做不是那么简单。假设你正在实现一个字符串类:
class UltimateString
{
char* start_;
char* end_;
char* endOfStorage_; //因为不能用_msize,叹息中....
public:
....其他函数....
};
现在假设你为UltimateString来特化Move,如下
template <>
void Move(UltimateString* src, void* dest)
{
UltimateString* typedDest = static_cast<UltimateString*>(dest);
typedDest->start_ = src->start_;
typedDest->end_ = src->end_;
typedDest->endOfStorage_ = src->endOfStorage_;
}
如果你认为这样可以了,那你就错了。这样不可以,因为标准给编译器增加它们自
己的数据到你的类里的自由(除非它们是POD)。这就是说:编译器可能在你的字符
串类中增加一个int __coolnessFactor_成员变量,一个你不知道的成员变量让你从src
到dest拷贝所有东西成为不可能。Move的结果是不可预料的。
C++强调每个有构造函数对象必须通过调用这些构造函数中的一个来创建。其他创建
对象的途径都是被禁止的。所以移动对象必须通过某些构造函数来实现。
teplate <typename T>
struct Takeover
{
explicit Takeover(T& obj) : obj_(obj) {}
T& Get() { return obj_; }
private:
T& obj_;
};
TakeOver在一个对象中包装了一个引用并提供对它的访问。
然后,你实现一个UltimateString的构造函数,它接受一个Takeover<UltimateString>
对象:
class UltimateString
{
char* start_;
剩余17页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
weixin_38750406
- 粉丝: 6
- 资源: 894
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)