我的程序中有一行代码:
float cache[featureHeight-1];
其中featureHeight是一个函数参数。现在当C编译器将它转换为汇编时,它是如何知道要分配多少堆栈空间的,因为featureHeight在编译时是不确定的?或者编译器是否将其转换为幕后的malloc调用?
(C99顺便说一句,没有编译器错误或警告,代码运行完美)
答案 0 :(得分:4)
通常不是malloc调用,但我想这是可能的。它只是在堆栈上保留必要的空间并使用它。此功能称为"可变长度数组"并在C99中推出。它的语义与普通编译时数组的语义相同,只是它们在运行时调整大小/分配。
就低级/汇编语言方面而言,featureHeight-1
乘以sizeof(float)
和堆栈指针的减量将是所需的全部。注意堆栈溢出!
答案 1 :(得分:2)
无需事先知道堆叠上预留的空间量。
在许多架构上,在堆栈上保留空间只需要从堆栈指针中减去一个值(任何值 - 不需要是静态的),然后将其用作指向值的指针。所以有一些运行时计算正在进行,但没有像malloc那样复杂。这些当然只是实现细节(C标准可能没有讨论堆栈指针),但这就是在实践中的工作方式。
某些平台甚至具有非标准功能,例如alloca,除了通过函数调用之外,它们的功能相同。
答案 2 :(得分:1)
C99确实能够获得动态大小的自动(堆栈分配)数组。
因此,您的方法的堆栈帧不会被修复,但会调整大小以适合您的阵列。