IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> allocator 类 -> 正文阅读

[C++知识库]allocator 类

new 有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起,我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定直到对象应有什么值。
当分配一大块内存时,我们通常计划在这块内存上按需构造对象,在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象创建操作。

allocator类

标准库allocator类型定义在头文件memory中,它帮助我们将内存分配和对象构造分离开。它提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。

  • allocator<T> a:定义一个名为a的allocator对象,它可以为类型为T的对象分配内存
  • a.allocator(n):分配一段原始的、未构造的内存,保存n个类型未T的对象
  • a.deallocator(p,n):释放从T*指针p中地址开始的内存,这块内存保存了n个类型未T的对象;p必须是一个先前由alloator返回的指针,且n必须是p创建时所要求的大小。在调用deallocator之前,用户必须对在这块内存中创建的对象调用destroy
  • a.construct(p,args):p必须时一个类型为T*的指针,指向一个原始内存;arg被出啊递给类型为T的构造函数,用来在p指向的内存中构造一个对象
  • a.destroy§:p为T*类型的指针,此算法对p指向的对象执行析构函数
allocator<string> alloc;//可以分配n个string的allocator对象
auto const p=alloc.allocator(n);//分配n个未初始化的string

allocator分配为构造的内存

allocator分配的类是未构造的。我们按需在此内存中构造对象。在新标准中。construct 成员函数接受一个指针和零个或多个额外参数,在给定位置构造一个元素。二外参数用来初始化构造的对象。类似make_shared的参数,这些额外参数必须是与构造的对象的类型匹配的合法的初始化器

auto q=p;//q指向最后构造的元素之后的位置
alloc.construct(q++);//*q为空字符串
alloc.construct(q++,10,'c');//*q为cccccccccc
allocator.construct(q++,'hi');//*q为hi

当我们用完对象后,必须对每个构造的元素调用destroy来销毁他们。函数destroy接受一个指针,对指向的对象执行析构函数。

while(q!=p)
	alloc.seatroy(--q);//释放我们真正构造的string 

一旦元素被销毁后,就可以宠幸使用这部分内存来保存其他的string,也可以将其归还给系统,释放内存通过调用deallocator来完成

alloc.deallocator(p,n);

拷贝和填充未初始化内存算法

  • uninitialized_copy(b, e, b2)从迭代器b和e指出的输入范围中拷贝元素到迭代器b2指定的未构造的原始内存中。b2指向的内存必须足够大,能容纳输入序列中元素的拷贝
  • uninitialized_copy_n(b,n,b2):从迭代器b指向的元素开始,拷贝n个元素到b2开始的内存中
  • unintialized_fill(b,e,t):在迭代器b和e指定的原始内存范围内创建对象,对象的值均为t的拷贝
  • uninitialized_fill_n(b,n,t):从迭代器b指向的内存地址开始创建n个对象。b必须指向足够大的为构造的原始内存,能够容纳给定数量的对象
    假定一个int的vector,希望将其内容拷贝到动态内存中。我们将分配一块比vector中元素所占空间大一倍的动态内存,然后将原vector中的元素拷贝到前一半空间,对后一半空间用一个给定值填充
auto p= alloc.alloate(v1.size()*2);
auto q=nuninitialized_copy(vi.begin(),vi.end(),p);
uninitialized_fill_n(q.vi.size(),42);
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 11:44:21  更:2021-09-01 11:46:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:41:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计