C++ Vector 实现内存管理基类
注意: 本人是原创, 如若发现雷同,后果自负
注意, 将使用C++ 17来实现
将使用统一的名称空间custom
设计
- 分配内存和释放内存
- 引用计数
- 管理使用大小
- 管理已分配的内存
文件名: Array_data.hpp
名称空间: custom
类名: Array_data_base
包含的头文件: Ref_count.hpp
// Array_data.hpp
#ifndef ARRAY_DATA_HPP
#define ARRAY_DATA_HPP
// 使用 Ref_count 类
#include "Ref_count.hpp"
namespace custom
{
// Array_data_base 其实就是一个分配内存的控制块
//
// 图:
// | Array_data_base | 分配的内存 |
class Array_data_base
{
public:
using size_type = typename Ref_count::count_type;
Ref_count _ref; //引用计数
size_type _alloc; //已分配的内存
size_type _size; //已占用的大小
// 构造一个Array_data_base
// type_size 构造类型的大小
// elem_size 元素个数
static Array_data_base* allocate(size_type type_size,
size_type elem_size)
{
// 构造Array_data_base和元素的存放的地址
void address = operator new(sizeof(Array_data_base) +
type_size * elem_size);
// 构造Array_data_base
new (address) Array_data_base();
Array_data_base* _new = static_cast<Array_data_base*>(address);
_new->_ref._atomic = 1;
_new->_alloc = elem_size;
_new->_size = 0;
return _new;
}
// 析构一个Array_data_base
// data Array_data_base
// type_size 构造类型的大小
// elem_size 元素个数
static deallocate(Array_data_base* data, size_type type_size)
{
_data->_size = 0;
_data->_ref._atomic = 0;
operator delete(_data, sizeof(Array_data_base) + type_size * _data->_alloc);
}
void* data() noexcept
{
return reinterpret_cast<char*>(this)+sizeof(*this);
}
const void* data() const noexcept
{
return reinterpret_cast<char*>(this)+sizeof(*this);
}
static const Array_data_base _shared_null;
static Array_data_base* shared_null()
{
return const_cast<Array_data_base*>(&_shared_null);
}
};
}
#endif