【发布时间】:2020-09-14 01:04:23
【问题描述】:
我以为我理解了 VLA 是什么,直到我在这里看到一个关于动态内存分配与可变长度数组之间的区别的问题。所以我没有任何问题,至少现在,动态内存分配,但我不明白为什么这段代码被认为是 VLA:
int size = 10; // or whatever
int my_array [size] ; // why this is a VLA
更神秘的是,这竟然是VLA
const int size = 10;
int my_array [size]; // why even when i use a const it is a VLA .
那么,我的问题是,这两种不同的方法如何被视为 VLA?
据我所知,一个 VLA 只是一个数组,它的大小只有在运行时才知道,就像我提示用户输入数组的大小并将数组设置为这个大小一样,这样就没有编译器将永远知道数组大小的方式。
但是,在上面的两段代码中,size 在编译时就已经知道了,所以如果这些是 VLA 是真的,那么标准数组语法必须是这样的,仅此而已。
int my_array[10];
我的另一个问题是,我听说const int size =10; 实际上不是一个 const,这意味着编译器不知道这个大小是否为 10,它将它视为一个变量。
所以,如果有人能弄清楚 C++ 中变量和 const 之间的区别,那将不胜感激。
注意:这是 StackOverflow 问题的链接。所以,如果这个问题有问题,有人可以纠正。
What's the difference between a VLA and dynamic memory allocation via malloc?
【问题讨论】:
-
C 和 C++ 是不同的语言。在 C 中
const int size = 10; int my_array [size];是 VLA,在 C++ 中不是。您链接了一个关于 C 的问题,但您标记了 C++ - 您对 C++ 还是 C 感兴趣? -
你说得对,优化编译器可以为两个版本生成相同的代码。但是因为将来可以添加例如一个 scanf() 来更改定义和使用非常量大小之间的值,编译器可能已经为此做好准备并生成实际上从内存中检索值的代码,即使它可以看到现在没有发生这样的事情.这不是 const 版本的情况:该值不能(合法)更改。
-
我对 c++ 感兴趣,但这并没有说明为什么编译器仍然知道这甚至是 VLA 大小,所以为什么 my_array 仍然是 VLA 以及 c 和 c++ 在它们的方式上有何不同使用 const 关键字
-
编译器可以在编译时推导出该值,但 C++ 标准规定此处的 int 不是常量,除非您明确将其设为常量,因此它是 VLA。一般来说,C++ 中的东西在默认情况下不被认为是常量,无论值是否可以在编译时推导出来。
-
i am interested in c++那么 VLA 不存在,C++ 中没有 VLA。
标签: c++ variables dynamic-memory-allocation variable-length-array