数据结构--数组类之DynamicArray类

上一篇我们实现了Array的子类:StaticArray类,今天我们实现Array的另一个子类:DynamicArray类。

DynamicArray类的设计要点:

用类模板实现。

继承自Array类。

动态确定内部数组空间的大小。

实现返回数组长度的函数。

实现拷贝构造和赋值操作功能。

对重复逻辑进行优化。

下面是DynamicArray类的声明:

    template <typename T>
    class DynamicArray : public Array<T>
    {
    protected:
        int m_length;

        T* copy(T* array, int len, int newlen);//新申请一个数组,并将原先数组内容拷贝至新空间。
        void update(T* array, int length);//更新数组指向和大小
        void init(T* array,int length);//对数组初始化,赋予空间和长度
       
    public:
        
        DynamicArray(int length);
        DynamicArray(const DynamicArray<T>& obj);
        DynamicArray<T>& operator =(const DynamicArray<T>& obj);
        int length() const;
        void resize(int length);

        ~DynamicArray();
       
    };

将代码出现的重复逻辑抽象成类的保护成员,供公有成员调用。

其中:

init作用:对象构造时的初始化操作

copy作用:在堆空间申请新的内存,并执行拷贝构造操作

update作用:将指定的堆空间作为内部存储数组使用,实现上保证了异常安全

将重复代码进行抽象后使得程序结构清晰,每个函数的功能十分明确。

下面是DynamicArray的完整实现。

    template <typename T>
    class DynamicArray : public Array<T>
    {
    protected:
        int m_length;

        T* copy(T* array, int len, int newlen)//新申请一个数组,进行数组拷贝
        {
            T* ret = new T[newlen];
            if(ret != NULL)
            {
                int size = (len < newlen) ? len : newlen;
                for(int i = 0; i < size; i++)
                {
                    ret[i] = array[i];
                }
            }
            return ret;
        }

        void update(T* array, int length)
        {
            if(array != NULL)
            {
                T* temp = this->m_array;

                this->m_array = array;
                this->m_length = length;

                delete [] temp;
            }
            else
            {
                 THROW_EXCEPTION(NoEnoughMemoryException,"No memory to update  DynamicArray object...");
             }
        }

        void init(T* array,int length)
        {
            if(array != NULL)
            {
                this->m_array = array;
                this->m_length = length;

            }
            else
            {
                THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create DynamicArray object...");
            }
        }
    public:
        DynamicArray(int length)
        {
            init(new T[length],length);
        }

        DynamicArray(const DynamicArray<T>& obj)
        {
            init(copy(obj.m_array,obj.m_length,obj.m_length),obj.m_length);
        }

        DynamicArray<T>& operator =(const DynamicArray<T>& obj)
        {
            if(this != &obj)
            {
                //将obj的内容复制出来
                update(copy(obj.m_array,obj.m_length,obj.m_length),obj.m_length);
           }

            return *this;
        }

        int length() const
        {
            return m_length;
        }

        void resize(int length)
        {
            if(length != m_length)
            {
                //将this的内容复制出来
                update(copy(this->m_array,m_length,length),length);
            }
        }

        ~DynamicArray()
        {
            delete [] this->m_array;
        }

    };

DynamicArray数组类优势在于可以动态指定数组长度使用resize函数,数组对象能够代替原生数组,使用上也更安全。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity Profiler是一款用于分析和优化Unity项目性能的强大工具。而"unclassified dynamic array"则是Profiler的一个常见分,指的是在运行期间动态创建的数组,但无法被具体分到其他Profiler分中。 "unclassified dynamic array"通常会在游戏代码中使用动态分配的数组时被Profiler标记出来。这意味着在运行过程中,游戏会动态地创建数组,并且这些数组型无法被Profiler系统识别或确定。 这个分实际上是一个提示,表明我们可能需要优化代码中的数组操作。动态分配的数组操作通常比固定大小的数组操作更昂贵和低效。当我们频繁地使用动态数组时,会导致内存的大量分配和释放,进而影响游戏的性能。 对于这种情况,我们可以通过减少动态数组的创建次数来优化性能。我们可以使用固定大小的数组、对象池或其他方法,来避免重复创建和销毁动态数组。另外,我们还可以使用Unity中的其他数据结构(如List、HashSet等)来替代动态数组,以提高性能。 同时,我们还可以通过在Profiler中查看"unclassified dynamic array"的相关数据,如内存分配和释放的次数、数组大小的变化等,来更详细地了解代码中的问题,并采取相应的优化措施。这可以帮助我们定位和修复潜在的性能问题,进而提升游戏的运行效率和用户体验。 总之,"unclassified dynamic array"是Unity Profiler中的一个常见分,提示我们在代码中使用了动态分配的数组,并且需要优化以提高游戏性能。通过减少动态数组的创建次数、使用其他数据结构和通过Profiler分析相关数据,我们可以有效地解决这个问题并提升游戏的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值