【问题标题】:How does the C compiler know how big to make the array?C 编译器如何知道数组的大小?
【发布时间】:2015-01-15 05:01:17
【问题描述】:

我的程序中有一行代码:

float cache[featureHeight-1];

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

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

【问题讨论】:

标签: c c99


【解决方案1】:

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

就底层/汇编语言方面而言,只需将featureHeight-1 乘以sizeof(float) 并减少堆栈指针即可。注意堆栈溢出!

【讨论】:

  • 语义略有不同,例如生命周期从声明点开始(而不是在封闭块的开头),并且不允许跨 VLA 声明向前跳转(iirc)。
【解决方案2】:

无需提前知道要在堆栈上保留的空间量。

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

有些平台甚至有一个非标准函数,例如 alloca,除了通过函数调用外,它的作用相同。

【讨论】:

    【解决方案3】:

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

    因此您的方法的堆栈框架不会固定,而是调整大小以适合您的数组。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      相关资源
      最近更新 更多