0
点赞
收藏
分享

微信扫一扫

C++ 内存分配层次以及memory primitives的基本用法

分配层次

C++ 内存分配层次以及memory primitives的基本用法_#endif

C++ memory primitives

分配

释放

类型

是否可重载

malloc

free()

C函数

不可

new

delete

C++表达式

不可

::operator new()

::operator delete()

C++函数


allocator::allocate()

allocator::deallocate()

C++标准库

可自由设计并以之搭配任何容器

分配与释放的四个用法

1、malloc and delete

void* p1 = malloc(512);   //512bytes
free(p1);

2、new and delete

complex<int>* p2 = new complex<int>;  //one object
delete p2;

**3、::operator new() and ::operator delete() **

void* p3 = ::operator new(512);   //512bytes,是个全局函数
::operator delete(p3);

4、allocator::allocate() and allocator::deallocate()
allocator就是分配器的名称,用的时候要告诉它用的每个单元是什么,例如这里我们给它int,这样就形成了一个type(类型).
类型名称(typename)后面加上小括号(),就形成了一个临时对象(建立的对象没有名称,生命周期只在使用的这一行)
注意GNUC,后面两种是GNUC4.9版以后的写法。向标准规范对齐了。

//以下使用C++标准库提供的allocators *
//其接口具有标准规格,但是收到编译器的影响,会有所不同。
#ifdef _MSC_VER
//以下函数都是non-static,要通过object调用,以下分配3个ints.
int* p4 = allocator<int>().allocate(3,(int*)10);
allocator<int>().deallocate(p4,3);
#endif
#ifdef _BORLANDC_
//以下函数都是non-static,要通过object调用,以下分配3个ints.
int* p4 = allocator<int>().allocate(5);
allocator<int>().deallocate(p4,5);
#endif
#ifdef _GNUC_
//以下函数都是static,
void* p4 = alloc::allocate(512);
alloc::deallocate(p4,512);
//以下兩函數都是 non-static,定要通過 object 調用。以下分配 7 個 ints.
void* p4 = allocator<int>().allocate(7);
allocator<int>().deallocate((int*)p4,7);

//以下兩函數都是 non-static,定要通過 object 調用。以下分配 9 個 ints.
void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9);
__gnu_cxx::__pool_alloc<int>().deallocate((int*)p5,9);
#endif

参考:

​​https://www.bilibili.com/video/BV1Kb411B7N8?p=3​​


举报

相关推荐

0 条评论