未知大小复杂度的堆栈分配

gil*_*lad 3 c++ memory

我知道堆栈分配需要固定的时间。据我了解,发生这种情况是因为可以在编译时确定分配大小。在这种情况下,程序知道运行一个功能需要多少内存,并且可以立即分配所需的全部内存。

如果仅在运行时知道分配大小,会发生什么情况?

例如,

void func(){
  int n;
  std::cin >> n;

  // this is a static allocation and its size is only known at run time
  int arr[n]; 
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在Linux上使用g ++ 5.4,此代码编译并运行。

Rin*_*dov 5

在不知道要分配多少空间的情况下,不可能(使用标准C ++语言)在堆栈上分配空间。

该行int arr[n];不是有效的C ++代码。它之所以会编译是因为您使用的编译器决定让您这样做,因此,有关更多信息,请参阅编译器文档。

对于GCC,您可以查看以下页面:https : //gcc.gnu.org/onlinedocs/gcc/Variable-Length.html


eer*_*ika 5

如果仅在运行时知道分配大小,会发生什么情况?

然后,程序格式不正确,因此不需要编译器来编译程序。

如果编译器确实进行了编译,则由编译器决定发生什么情况(除了发出诊断消息,这是标准所要求的)。这通常称为“语言扩展”。可能发生的情况是:为数组分配的内存量由运行时参数确定。编译器的文档中可能提供了更多详细信息。

  • 对于编写这样的代码的用户,重要的是要告知它仅被接受,因为编译器实现了扩展。这样可以消除关于SO的一堆问题。 (2认同)