C++可以用变量定义数组了么

2017 年 10 月 23 日
 dekira

偶然发现 c++可以用变量定义数组了... 这是为啥?新的标准么?求解答

Clion,Ubuntu,支持 c++11,其他见图吧!......然而不能发图!

5096 次点击
所在节点    C
32 条回复
RLib
2017 年 10 月 23 日
用 alloca 不就好了
yingtl
2017 年 10 月 23 日
@lrxiao 具体是什么 security 呢? 检查长度能避免么
sumless
2017 年 10 月 23 日
你这个应该是被编译器优化了,你可以看一下编出来的汇编代码,肯定是直接把变量 a 给省略了。
你把你的测试代码改成这样试试:写一个子函数,传入 int a 这个参数来决定数组大小,这时候编译器就不知道要分配多大了。
dekira
2017 年 10 月 23 日
@sumless 子函数也可以
lrxiao
2017 年 10 月 23 日
@yingtl 可以 那为什么不直接开 T arr[10000]呢 VLA 实际上会编译出来一坨代码

https://stackoverflow.com/questions/1887097/why-arent-variable-length-arrays-part-of-the-c-standard

同样 alloca 也不推荐
htfy96
2017 年 10 月 24 日
@allinwonder #20 然而这是 20 年前的 C 的 feature GNU coreutils 经常用
visionsmile
2017 年 10 月 24 日
@luoqeng #19 柔性数组是这样,而且也是 C 里特有的东西:

```cpp
struct A{
char tag;
char alz[];
};
```

详见:[Array of length zero]( https://imzlp.me/posts/21095/)
yingtl
2017 年 10 月 24 日
@lrxiao 我还以为这个实现挺简单的呢。看看有没有空间挪动个栈指针就行了呢。 怎么会有一坨代码呢
yingtl
2017 年 10 月 24 日
@lrxiao 不用一个很大的普通的栈上的数组是因为当需要多个这样数组的时候可能造成很多“空隙”, 太多的话就爆了
lrxiao
2017 年 10 月 24 日
yingtl
2017 年 10 月 25 日
lrxiao
2017 年 10 月 25 日
@yingtl 你这个例子没用到 arr 所以比较简单 实际上应该都会插入检查栈空间的汇编

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/399860

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX