初始化零填充阵列的运行时间

时间:2013-08-09 23:12:40

标签: c arrays runtime zerofill

如果我使用堆栈上的零填充初始化语法定义以下数组:

int arr[ 10 ] = { 0 };

...是运行时常数还是线性?

我的假设是它是一个线性运行时间 - 我的假设仅针对calloc必须遍历每个字节以将其填充为零的事实。

如果你也可以提供一个原因,而不仅仅是它的订单xxx将是巨大的!

2 个答案:

答案 0 :(得分:1)

运行时在数组大小上是线性的。

要了解原因,这里是memset的sample implementation,它将数组初始化为任意值。在汇编语言级别,这与您的代码中发生的情况没有什么不同。

void *memset(void *dst, int val, size_t count) {
    unsigned char *start = dst;
    for (size_t i = 0; i < count; i++)
        *start++ = value;
    return dst;
}

当然,编译器通常会使用intrinsics一次设置多个数组元素。根据数组的大小以及对齐和填充等内容,这可能会使运行时数组长度更像楼梯,步长大小取决于向量长度。对于数组大小的微小差异,这将有效地使运行时保持不变,但一般模式仍然是线性的。

答案 1 :(得分:1)

这实际上是冰山问题的一小部分。您真正要问的是初始化数组的顺序(Big Oh)是什么。本质上,代码循环遍历数组的每个元素并将它们设置为零。你可以编写一个for循环来做同样的事情。

该循环的数量级为O(n),也就是说,循环中花费的时间与初始化元素的数量成比例增加。

如果硬件支持一条指令,说明将所有字节从位置X设置为Y并且该指令在M个指令周期内工作且M从未改变,无论字节数被设置为零,那么那将是订单k,或O(k)。

通常,O(k)可能被称为常数时间,O(n)可能被称为线性。