C编译器如何知道数组的大小?

时间:2014-11-18 05:09:03

标签: c c99

我的程序中有一行代码:

float cache[featureHeight-1];

其中featureHeight是一个函数参数。现在当C编译器将它转换为汇编时,它是如何知道要分配多少堆栈空间的,因为featureHeight在编译时是不确定的?或者编译器是否将其转换为幕后的malloc调用?

(C99顺便说一句,没有编译器错误或警告,代码运行完美)

3 个答案:

答案 0 :(得分:4)

通常不是malloc调用,但我想这是可能的。它只是在堆栈上保留必要的空间并使用它。此功能称为"可变长度数组"并在C99中推出。它的语义与普通编译时数组的语义相同,只是它们在运行时调整大小/分配。

就低级/汇编语言方面而言,featureHeight-1乘以sizeof(float)和堆栈指针的减量将是所需的全部。注意堆栈溢出!

答案 1 :(得分:2)

无需事先知道堆叠上预留的空间量。

在许多架构上,在堆栈上保留空间只需要从堆栈指针中减去一个值(任何值 - 不需要是静态的),然后将其用作指向值的指针。所以有一些运行时计算正在进行,但没有像malloc那样复杂。这些当然只是实现细节(C标准可能没有讨论堆栈指针),但这就是在实践中的工作方式

某些平台甚至具有非标准功能,例如alloca,除了通过函数调用之外,它们的功能相同。

答案 2 :(得分:1)

C99确实能够获得动态大小的自动(堆栈分配)数组。

因此,您的方法的堆栈帧不会被修复,但会调整大小以适合您的阵列。