【问题标题】:How memory allocation work for Array and vectors?数组和向量的内存分配如何工作?
【发布时间】:2014-04-02 18:30:52
【问题描述】:

我知道数组的大小无法调整大小,Vector 是一个选项。

我很想知道内存分配将如何为他们俩工作。

【问题讨论】:

  • 对于java:它管理一个数组并在需要扩展时调整大小并复制它
  • 请注意,在某些情况下,数组的大小可以调整,即通过 C 库的realloc 和/或通过系统特定的方式。但是,首先,realloc保证调整大小,其次,std::vector 的要求是(我记得)它不能在内部使用realloc。即使这通常会大大加快速度。

标签: java c++ arrays memory-management vector


【解决方案1】:

对于Vector,它管理array internallyupon need,它分配newer array with bigger size 并将现有数据复制到更新的数据

【讨论】:

  • 问题是(至少现在)标记为 C++ 并且没有提及 Java。
  • @crash 它被标记为 java,我认为它一般是关于数据结构的
  • 顺便说一句,我不是反对你的人。奇怪的是我看不到编辑历史,但我怀疑可能有标签切换。
【解决方案2】:

向量具有一定的容量,这对应于可以在向量中存储多少元素而无需调整大小 - 这是“幕后”数组的实际大小。

达到容量后,创建一个长度更大的新数组(增量大小可能不同,可以配置),所有元素都复制到新数组中。在没有自动垃圾收集的语言中,应该删除旧数组。

这种操作的算法复杂度是O(n)

对于所有编程语言,这种结构的实现几乎相同,至少从算法的角度来看是这样。维基链接here

说到Java——Vector类的实现是开源的,源代码通常随JDK一起提供。但如果你没有 - 你可以在互联网上找到它,例如这里:Vector

【讨论】:

    【解决方案3】:

    既然你说的是固定大小的数组,我假设你想比较类似的东西

    int my_array[10];
    

    vector<int> my_vector;
    

    在第一种情况下,程序将请求内存中所需的空间,并将该空间视为您的代码所遵循的连续整数。

    至于向量,它是一个在内部管理一些内存位置的类,因此,正如您编写的代码一样,当您向它请求一些值时,它会寻找它所在的位置并给您结果。

    向量不会分配无限长的内存,所以如果它为十个整数分配了内存,然后你添加第十一个,它会自动收集更多的内存空间并找到一种方法来保存实际值。

    如何实现取决于实现。每次需要更多时,我使用的内存空间都会翻倍,并将以前的值复制到新位置。

    一些程序员喜欢编写自己的向量类,让它每次都请求固定大小的内存,或者为特定的常量乘以空间。


    一些推理:

    为什么向量没有通用规则?

    对不起,我不能给你一个非常通用的“向量是如何工作的”,但这就是向量的想法,他们做的工作,你不用担心 =) 每个实现都有它的理念。 Java 的我不知道,但必须和我知道的 C++ 类似。

    为什么要加倍大小?或者为什么要求固定大小?

    假设您需要存储一千个整数。

    每次需要更多空间时,该请求空间的向量为 10 个整数,将分配 10,然后加 10,然后加 10,然后...一百个分配。

    每次将其大小翻倍的向量将请求 1、2、4、8、16、32、64、128、256、512、1024 的空间。只有十个分配。

    一些程序员不希望最后有 24 个空格,或者只想要一个分配(立即分配一千个),所以他们创建了一个向量类,分配一些他们认为好的固定内存大小。

    C++ 向量具有专门针对此问题的函数,例如 resize(),它将要求向量具有特定大小,或 reserve(),它将要求向量在内存中保留特定数量的空间。


    而且,至少,这个网站是黄金:

    http://www.cplusplus.com/reference/vector/vector/

    这是关于 C++ 实现的,但这个想法是通用的。而且读书很好=)

    【讨论】:

      【解决方案4】:

      如果数组是动态分配的,您可以调整其大小。 例如,在 c 中,您通过 malloc() 函数动态分配内存。你可以重新分配这块内存空间,并通过 realloc() 改变它的大小。

      如果你以这种方式在 c/c++ 中分配数组:

      int array[5];
      

      它将被分配在您进行声明的函数的堆栈帧中。 相反,向量是一个高级对象,在堆内存段上动态分配。

      【讨论】:

        【解决方案5】:

        正如 Jigar 所说,它在内部管理数组,以下是如何增加大小的实现(我说的是 Java):

        //This ensures size of Vector
        private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                             capacityIncrement : oldCapacity);
            if (newCapacity - minCapacity < 0)
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            //elementData is array of type Object
            elementData = Arrays.copyOf(elementData, newCapacity); //Copies the specified array with specified capacity for array
        }
        

        在Vector中添加任何数据时都会调用上述方法,它会确保新创建的Vector的大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-07
          • 1970-01-01
          • 2022-01-17
          • 2014-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-10
          相关资源
          最近更新 更多