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

本文介绍如何使用C++17标准来设计一个内存管理基类,该类涉及内存分配、释放、引用计数以及管理已分配内存的功能。文章详细探讨了类的设计思路,并提及了相关命名空间、类名和所需的头文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_num)
    {
        // 构造Array_data_base和元素的存放的地址
        void* address = operator new(sizeof(Array_data_base) +
                                    type_size * elem_num);

        Array_data_base *_new = static_cast<Array_data_base *>(address);
        // 构造Array_data_base
        new (_new) Array_data_base();

        _new->_ref._atomic = 1;
        _new->_alloc = elem_num;
        _new->_size = 0;

        return _new;
    }

    // 析构一个Array_data_base
    // data      Array_data_base
    // type_size 构造类型的大小
    // elem_size 元素个数
    static void deallocate(Array_data_base *_data, size_type type_size) noexcept
    {
        _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<const char *>(this) + sizeof(*this);
    }

    static const Array_data_base _shared_null;
    static Array_data_base *shared_null() noexcept
    {
        return const_cast<Array_data_base *>(&_shared_null);
    }
};

const Array_data_base Array_data_base::_shared_null{
    std::numeric_limits<size_type>::max(),
    0,
    0
};

}

#endif

Array_data_base 的用处

上一篇: C++ 高效的容器 - Vector - 实现底层 - 引用计数类
下一篇: C++ Vector 实现内存管理类
QQ交流群: 552641067

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值