C++ Vector 实现内存管理基类

C++ Vector 实现内存管理基类

注意: 本人是原创, 如若发现雷同,后果自负

注意, 将使用C++ 17来实现
将使用统一的名称空间custom

设计

  1. 分配内存和释放内存
  2. 引用计数
  3. 管理使用大小
  4. 管理已分配的内存

文件名: 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

Array_data_base 的用处

上一篇: C++ 高效的容器 - Vector - 实现底层 - 引用计数类

猜你喜欢

转载自blog.csdn.net/m0_47534090/article/details/108656978
今日推荐