关于数组分配的一般问题,主要是在Java中,但我认为它与所有编程语言相关:
为大小为n的数组[以O(n)为单位)分配内存需要多长时间?我可以想象一个实现,其中内存分配在恒定时间内发生:如果你有大量的空内存,你可以创建一个指向新数组的第一个和最后一个索引的指针,但是通常如何分配内存? (另外,至少在Java中,如果初始化整数数组,则数组中的所有值最初都设置为0;这是否意味着数组中的每个索引都单独设置为等于0,这将操作O(n)?)
谢谢。
关于数组分配的一般问题,主要是在Java中,但我认为它与所有编程语言相关:
为大小为n的数组[以O(n)为单位)分配内存需要多长时间?我可以想象一个实现,其中内存分配在恒定时间内发生:如果你有大量的空内存,你可以创建一个指向新数组的第一个和最后一个索引的指针,但是通常如何分配内存? (另外,至少在Java中,如果初始化整数数组,则数组中的所有值最初都设置为0;这是否意味着数组中的每个索引都单独设置为等于0,这将操作O(n)?)
谢谢。
我跑了一个 微基准 在hotspot上 - 发布JIT编译,分配一个数组(在i7上)需要:
所以回答你的问题, 根据经验,它似乎是热点上的O(n)。
详细结果:
Benchmark Mode Thr Cnt Sec Mean Mean error Units
c.a.p.ArrayVsList.createArray1 avgt 1 5 2 12.293 0.867 nsec/op
c.a.p.ArrayVsList.createArray10000 avgt 1 5 2 428.369 9.997 nsec/op
c.a.p.ArrayVsList.createArray1M avgt 1 5 2 342972.975 7253.989 nsec/op
null
(或者在创建数组时为0)你已经自己回答了这个问题 O(n)
在Java中,因为元素被初始化,而有些语言就是这种操作 O(1)
因为没有初始化。
只是为了确定
public class ArrayTest {
public static void main(String[] args) {
int[] var = new int[5];
}
}
产生
public class ArrayTest extends java.lang.Object{
public ArrayTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: newarray int
3: astore_1
4: return
}
和文档说 newarray:
一个新数组,其组件的类型为atype,长度为count 从垃圾收集堆中分配。引用arrayref到 这个新的数组对象被推入操作数堆栈。 每 的 新数组的元素是 初始化为默认初始值 对于数组的类型(§2.5.1)。
AFAIK,阵列分配总是O(n),直到你可以拥有的最大尺寸。这是因为将存储器归零的成本也是O(n)。系统可以采取一些技巧来加快速度。即它不必将每个字节清零,它可以使用一些虚拟内存技巧将整个页面清零,但即便如此,这也是O(n)。