c - C 中数组声明和定义的时间复杂度是多少?

标签 c arrays time-complexity variable-declaration

在 C 中声明和定义(但不初始化)数组的时间复杂度是多少?答案为何如此?

我对编译时和运行时的时间复杂度感兴趣,但更感兴趣的是运行时。

这是一个具有此类数组的程序示例:

int main () 
{
    int n[ 10 ]; /* n is an array of 10 integers */
    return 0;
}

如果不是 O(1),恒定时间,是否有一种语言可以在恒定时间内声明和定义数组?

最佳答案

语言没有指定这一点。但在典型的实现中, block 中所有局部变量的空间分配只需在进入该 block 时根据所有变量的总大小调整堆栈指针即可,即 O(1)。数组只是包含在总大小中,并在编译时计算。进入 block 时不会分配 VLA,分配会延迟到声明执行时(因为它取决于必须首先分配的变量),但它仍然只是调整 SP 寄存器的 O(1) 操作。

我认为许多实现实际上在进入函数时为函数分配了所有空间,而不是调整每个 block 的 SP。但是存在于不重叠的 block 中的变量可能共享堆栈帧中的相同内存。但这与所提出的问题并不真正相关,除非您想知道两者之间是否有区别

int a[10];
int b[10];
// code that uses a and b

int a[10];
{
    int b[10];
    // code that uses a and b
}

每个变量的编译时复杂度为 O(1)(它只需要查找数据类型的大小,如果是数组则乘以大小),因此 O(n),其中 n 是数字局部变量。

关于c - C 中数组声明和定义的时间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991681/

相关文章:

algorithm - 使用 BFS 或 DFS 确定非连通图中的连通性?

performance - 涉及多个变量的程序的时间复杂度

c - 如何在C中将文件内容读取为字符串?

c - 我用了hsearch,以后可以加hsearch_r吗? - 混合 hsearch 和 hsearch_r

c - 内部文件?系统调用读写

c++ - boost::multi_array reshape() 函数的复杂性

c++ - 错误[P​​e167] : argument of type "uint16_t *" is incompatible with parameter of type "unsigned char *"

javascript - 遇到 JavaScript Array.indexOf 的奇怪现象(在 Node.js 中)

python - 如何根据索引过滤 numpy 数组?

c - strcmp 或数组错误?