【问题标题】:Why is this code considered a VLA even though it uses an int?为什么这段代码即使使用 int 也被视为 VLA?
【发布时间】: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


【解决方案1】:

首先,C++ 中不存在可变长度数组。 C++ 中没有可变长度数组。此答案仅适用于特定的 GNU 编译器扩展,以支持 C++ 中的可变长度数组。

编译器仍然知道为什么这甚至是 VLA 大小

问题不在于“编译器知道什么”,而在于定义。定义了术语和语言,定义了什么是 VLA,什么不是。可变长度数组定义为大小不是整数常量表达式的数组 - int vla[<not integer constant expresion>];。来自C99 6.7.5.2p4

如果大小是一个整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。

什么是和不是一个整数常量表达式又一次有了一个非常确定的定义。

在 C 中,对于 int size = 10;const int size = 10; 两个定义,作为表达式的 size 不是 integer constant expression。因此,您显示的两个数组定义都是可变长度数组。结束。

在 C++ 中,没有整数常量表达式,而且很可能(我的猜测!)在启用了 VLA 扩展的 C++ 中工作的 GNU 编译器会检查数组声明中的大小表达式是否为 usable in a constant expression。在 C++ 中,const 限定的整数类型可用于常量表达式,因此 const int size = 10; int my_array [size]; 是一个普通数组。非 const 限定的整数类型在常量表达式中不可用,因此 int size = 10; int my_array [size]; 在 C++ 中无效,并且在启用扩展的 GNU 编译器中会导致可变长度数组。

为什么这段代码即使使用 int 也被视为 VLA?

“使用 int”并不一定使表达式成为常量表达式,这对于不是可变长度数组的数组定义内的括号内的表达式是必需的。

这两种不同的方法如何被视为 VLA?

对于 C,数组定义中括号内的表达式必须是常量表达式,因为不是,这两个代码 sn-ps 导致 VLA 声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2016-05-16
    相关资源
    最近更新 更多