C++中的内存分配
std::allocator<T>

std::vector<T>
- template<class T>
- class vector
- {
- public:
- vector():elements(),first_free(),end(){}
- void push_back(const T&);
- //…
- private:
- static std::allocator<T> alloc;
- void reallocate();
- T* elements;
- T* first_free;
- T* end;
- //…
- };
- template<class T>
std::vector<T>::push_back(const T& t)
- template <class T>
- void vector<T>::push_back(const T& t)
- {
- //are we out of space
- if(first_free == end)
- reallocate();// gets more space and copies existing elements to it
- alloc.construct(first_free,t);
- ++first_free;
- }
- template <class T>
- void vector<T>::reallocate()
- {
- std::ptrdiff_t size = first_free – elements;
- std::ptrdiff_t newcapacity = * max(size,);
- T* newelements = alloc.allocate(newcapacity);
- uninitialized_copy(elements,first_free,newelements);
- for(T *p = first_free; p != elements;}
- alloc.destroy(--p);
- if(elements)
- alloc.deallocate(elements,end-elements);
- elements = newelements;
- first_free = elements + size;
- end = elements + newcapacity;
- }
- template <class T>
operator new 函数和 operator delete 函数
- //new expression
- string *sp =new string(“initialized”);
首先,该表达式调用名为 operator new 的标准库函数,分配足够大的原始的未类型化的内存;
- //new expression
- delete sp;
首先,对 sp 指向的对象运行适当的析构函数;
operator new 和 operator delete 接口
- void*operator new(size_t);
- void*operator new[](size_t);
- void*operator new(std::size_t size,void* ptr)throw();//placement
- void*operator delete(void*);
- void*operator delete[](void*);
- void*operator new(size_t);
placement new 定位 new 表达式
- std::allocator<std::string> alloc;
- string *sp = alloc.allocate();// allocate space to hold 2 strings
- new(sp) string(b,e);
- alloc.construct(sp +, string(b,e));
- std::allocator<std::string> alloc;

类特定的 new 和 delete
一个内存分配器基类
- template<class T>
- class CachedObj
- {
- public:
- void* operator new(std::size_t);
- void* operator delete(void*, std::size_t);
- virtual ~CachedObj(){}
- protected:
- T* next;
- private:
- static void add_to_freelist(T*);
- static std::allocator<T> alloc_mem;
- static T* freeStore;
- static const std::size_t chunk;
- }
- template<class T>
- template<class T>
- void*CachedObj<T>::operator new(size_t sz)
- {
- if(sz != sizeof(T)) return nullptr;
- if(!freeStore)
- {
- T* array = alloc_mem.allocate(chunk);
- for(size_t i =; i != chunk;++i)
- add_to_freelist(&array[i]);
- }
- T*p = freeStore;
- freeStore = freeSore->CachedObj<T>::next;
- return p;
- }
- template<class T>
- void CachedObj<T>::add_to_freelist(T*p)
- {
- p->CachedObj<T>::next = freeStore;
- freeStore = p;
- }
- template<class T>
- void CachedObj<T>::operator delete(void*p)
- {
- if(p != )
- add_to_freelist(static_cast<T*>(p));
- }
- template<class T>

- template<classType>
- class QueueItem:
- publicCachedObj<QueueItem<Type>>{};
- template<classType>

C++中的内存分配的更多相关文章
- C语言中的内存分配与释放
C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...
- rt-thread中动态内存分配之小内存管理模块方法的一点理解
@2019-01-18 [小记] rt-thread中动态内存分配之小内存管理模块方法的一点理解 > 内存初始化后的布局示意 lfree指向内存空闲区首地址 /** * @ingroup Sys ...
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- java中子类实例化过程中的内存分配
知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...
- Java实例化对象过程中的内存分配
Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...
- Netty 中的内存分配浅析
Netty 出发点作为一款高性能的 RPC 框架必然涉及到频繁的内存分配销毁操作,如果是在堆上分配内存空间将会触发频繁的GC,JDK 在1.4之后提供的 NIO 也已经提供了直接直接分配堆外内存空间的 ...
- Netty 中的内存分配浅析-数据容器
本篇接续前一篇继续讲 Netty 中的内存分配.上一篇 先简单做一下回顾: Netty 为了更高效的管理内存,自己实现了一套内存管理的逻辑,借鉴 jemalloc 的思想实现了一套池化内存管理的思路: ...
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- iOS程序中的内存分配 栈区堆区全局区
在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...
- c++中函数中变量内存分配以及返回指针、引用类型的思考
众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量.指针.引用等等). 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函 ...
随机推荐
- [LC] 318. Maximum Product of Word Lengths
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- C++对数组进行复制
C++ 风格的复制操作 使用STL中的copy算法 int a[] = {1,2,3,4,5}; int b[5]; std::copy(std::begin(a),std::end(a),std:: ...
- 如何创建Hexo站点的Tags和Categories默认页面
安装Hexo的categories生成插件 1 $ npm install hexo-generator-category --save 安装Hexo的Tags生成插件 1 $ npm install ...
- 吴裕雄--天生自然python学习笔记:Python3 标准库概览
操作系统接口 os模块提供了不少与操作系统相关联的函数. >>> import os >>> os.getcwd() # 返回当前的工作目录 'C:\\Python ...
- spring配置ConcurrentMap实现缓存
spring本身内置了对Cache的支持,本次记录的是基于Java API的ConcurrentMap的CacheManager配置. 1.xml文件中增加命名空间 <beans xmlns=& ...
- Nginx笔记总结三:内核参数优化
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800 net.ipv4.ip_conntrack_max = 16777216 ...
- Java 内部类(成员内部类、局部内部类、静态内部类,匿名内部类)
一.什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用publ ...
- 默认的Settings.xml文件(无修改过)-Maven
Tip: 当什么都不作修改时,默认是从Maven中央仓库进行下载,https://repo.maven.apache.org/maven2. 打开maven源码下的lib文件夹,找到maven-mod ...
- python 常用模块介绍
1.定义 模块:用来从逻辑上组织python代码(变量.函数.类,逻辑),本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test). 包:用来从逻辑上组织模块的,本质就是 ...
- js中判断为false的情况
document.write((new Boolean())+"<br />"); document.write((new Boolean(" ...