c++ - 为什么这段代码即使使用 int 也被视为 VLA?
问题描述
我以为我理解了 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 问题的链接。所以,如果这个问题有问题,有人可以纠正。
解决方案
首先,C++ 中不存在可变长度数组。C++ 中没有可变长度数组。此答案仅适用于特定的 GNU 编译器扩展,以支持 C++ 中的可变长度数组。
编译器仍然知道为什么这甚至是 VLA 大小
问题不在于“编译器知道什么”,而在于定义。定义了术语和语言,定义了什么是 VLA,什么不是。可变长度数组定义为大小不是整数常量表达式的数组- int vla[<not integer constant expresion>];
。从C99 6.7.5.2p4 开始:
如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是变长数组类型;否则,数组类型是可变长度数组类型。
什么是和不是整数常量表达式又再次具有非常确定的定义。
在 C 中,具有定义int size = 10;
和asconst int size = 10;
的size
表达式不是整数常量表达式。因此,您显示的两个数组定义都是可变长度数组。结束。
在 C++ 中,没有整数常量表达式,很可能(我的猜测!)在 C++ 中工作并启用 VLA 扩展的 GNU 编译器检查数组声明中的大小表达式是否可用于常量表达式。在 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,数组定义中括号内的表达式必须是常量表达式,因为不是,这两个代码片段导致 VLA 声明。
推荐阅读
- android - [iOS][Android] AppStore 和发布:发布是否会因为 webview 而被拒绝?
- yubico - 如何将现有的 RSA 密钥导入 YubiHSM?
- python - python - 如何在不在python中导入任何内容的情况下获得数字的平方根?
- javascript - 将文本文件读入 Typescript 中的对象数组
- svg - FloMAT 库导出
- python - 返回函数在我的 python 模块中无法正常工作
- excel - 排序表不包括第一行
- php - 在 PHP 中将本地假期添加到日期/时间计算
- c++ - 派生类销毁的最佳实践是什么?
- reactjs - 将 Truepush 初始化代码添加到 Gatsby