用于定义数组大小的运行时常量

run-time const to define array size

本文关键字:运行时 常量 定义 数组 用于      更新时间:2023-10-16

可能重复:
C/C++:运行时的数组大小是否允许动态分配?

在下面的列表中,buf的大小显然是由运行时常数j决定的。编译器如何生成代码来分配堆栈上的存储(在编译时不知道j的值)?

#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
  srandom(time(NULL));    
  int i = random();
  cout<< "random number: "<<i<<endl;
  if(i%2==0)
    i=2;
  else
    i=1;
  const int j=i;
  char buf[j];
  std::cout<<"size of buf array: "<<sizeof(buf)<<endl;
  return 0;   
}

我假设您使用的是gcc,因此使用的是VLA扩展。这不是标准C++,它是从C++0x(1x)中删除的。

理由是它并没有那么有用,而且由于类型系统更强,C++实现将比C中的实现复杂得多。

实际上,如果您在堆栈中分配未知大小的数组,那么您同时也在编写可能会破坏堆栈的危险代码。如果你知道大小,那么它就不是问题,否则就动态分配它。当然有非常有效的用例,这是一个"很好的拥有"功能,但他们最终决定不这样做。

这是关于这个问题的一个很好的总结。

符合要求的C++编译器不会接受您的代码。尽管j是一个const,但它并不是一个常数表达式。

gcc在C++代码中接受这一点作为扩展(根据语言标准,它只允许在C99代码中使用)。基本上,它在堆栈上为buf分配空间。它(通常)通过从当前堆栈指针中减去一些量来实现这一点。从生成的代码的角度来看,在一台典型的机器上处理非常量代码是非常琐碎的。

编译器只需要增加堆栈大小,并将buf变量指向堆栈上新创建的空间。给定运行时的大小,没有理由不能动态地执行此操作。(尽管从编程的角度来看,这样做可能不明智。)