【问题标题】:Variable sized array on the stack [duplicate]堆栈上的可变大小数组[重复]
【发布时间】:2023-04-01 10:58:01
【问题描述】:

据我了解,在 C 和 C++ 中,我们在堆栈上创建其大小在编译时已知的数据结构,并且我们将堆(无 malloc/new-delete)用于大小未知的东西编译时间并在运行时决定。那么,我的 g++ 编译器是否允许我执行以下代码 sn-p 之类的操作。

int main(void)
{
    int n ;
    cin >> n ; // get the size of array.
    int arr[n] ; // create a variable sized array.
    .... do other stuff ...
}

具体来说,在数组的情况下:
数组在栈上被分配了一块连续的内存,栈上和栈下都有变量,所以必须知道数组的大小,以便栈上数组上面的变量、数组本身和下面的变量堆栈上的数组都可以整齐地放入内存中。 堆栈上的可变大小数组是如何实现的? 为什么它们甚至是必要的?为什么我们不能只将堆用于可变大小的缓冲区?

编辑:
我从 cmets 了解到,C 和 C++ 对 VLA 是否为标准有不同的规则,还有 Neil Butterworth 的评论,即一次询问两种语言的问题通常不是一个好主意。谢谢大家,所以我从我的问题中删除了 C 标记,因为我打算主要询问 C++,代码 sn-p 语法很明显。很抱歉造成混乱,并感谢您的回复。

【问题讨论】:

  • C++ 不支持 VLA。
  • 这样的数组不是标准 c++ 的一部分。
  • @felix alloca 也不是标准 C++ 的一部分。
  • "为什么它们甚至是必要的?" --> 为什么不把所有的编程都用汇编来完成呢?同样的原因...

标签: c++ arrays stack


【解决方案1】:

它们在标准 C++ 中是不允许的,但它们在标准 C 中是允许的,而 g++ 在 C++ 中也允许它们,as a language extension

那么堆栈上的可变大小数组是如何实现的呢?

this question。要点是大小 (n) 被评估并存储在编译器生成的局部变量中,然后分配那么多堆栈空间。没有物理定律说堆栈变量的大小必须在编译时知道 - 只是这样更简单。

为什么它们甚至是必要的?

他们不是。在您的帮助下,您可以使用动态分配来做同样的事情。

为什么我们不能只将堆用于可变大小的缓冲区?

堆栈分配更高效。

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 2011-03-22
    • 2019-05-27
    • 2021-03-15
    • 2019-04-13
    • 2011-12-10
    • 2012-09-23
    • 2014-01-31
    相关资源
    最近更新 更多