gcc 可变长度数组

2022-05-10 07:48:03 +08:00
 void59468

variable length array 在 c++里应该是不支持的吧, 但我用 gcc 可以编译啊,有没有办法关掉呢?

int main() { int a; cin >> a; int b[a]; }

2453 次点击
所在节点    C++
17 条回复
elfive
2022-05-10 08:12:06 +08:00
类似于标准库里的 alloca 函数,他也是在栈上申请的内存,不是堆里面
inhzus
2022-05-10 08:19:11 +08:00
善用搜索引擎
Google:gcc disable variable length array

第一个搜索结果,stack overflow 回答:
-Werror=vla
nlzy
2022-05-10 08:20:16 +08:00
-Werror=vla
void59468
2022-05-10 08:25:40 +08:00
@inhzus 看漏了,以为只是 warning
codehz
2022-05-10 08:40:00 +08:00
建议直接
-pedantic -Werror=pedantic
void59468
2022-05-10 10:44:25 +08:00
@codehz 好像并不能把 warning 转成 error
<a href="https://ibb.co/nn5hb58"><img src="https://i.ibb.co/3MLt7LY/Clipboard02.jpg" alt="Clipboard02" border="0"></a>
3dwelcome
2022-05-10 10:45:57 +08:00
alloca 的分配性能和运行速度是内存管理器里最快的,比 malloc 快多了,很适合小数组,关掉干嘛。
codehz
2022-05-10 11:00:57 +08:00
@void59468 记错了,是-pedantic-error
chilledheart
2022-05-10 11:19:07 +08:00
由于是 C 扩展,所以不能用-std=c++11 覆盖。
icyalala
2022-05-10 12:34:56 +08:00
@3dwelcome 现在 alloca 的实现基本就是把 stack pointer 加个值,连函数调用都不是,基本算不上内存管理器。
实际和 vla 、递归一样,倒不是不好用,只是有些开发者搞不清楚用法或者误用了,很容易就 stackoverflow 。
senninha
2022-05-10 13:06:14 +08:00
x86/64 上变长数组就是 rsp 减个值,当前函数栈退出的时候就直接销毁了。
yanqiyu
2022-05-10 13:32:59 +08:00
@senninha 所以说要是一个函数用了 alloca 然后被内联到了循环体里面就会出事
yanqiyu
2022-05-10 13:41:42 +08:00
不过我又看了下,gcc 遇到 alloca 或者 vla 就会避免内联 https://gcc.gnu.org/onlinedocs/gcc/Inline.html
senninha
2022-05-10 14:27:33 +08:00
@yanqiyu 大佬牛逼
ipwx
2022-05-10 14:36:10 +08:00
在栈上分配可变内存,太大了就会爆栈。又会导致和其他一些编译手段不兼容。所以很没意思。

我记得人家做栈内存优化,都是先 char buffer[1024]。如果需求更大就 malloc
Cu635
2022-05-11 09:57:46 +08:00
可变长度数组就是 C++引入的吧,之后 c 语言的 c99 标准看着这玩意儿挺好也就跟着引入了。
cnbatch
2022-05-11 21:54:24 +08:00
@Cu635 不是 C++的。

在 C99 之前的 VLA 原本只是 GCC 自己的扩展,然后在 C99 转正了。类似的还有_Decimal 系列(_Decimal32 、_Decimal64 、_Decimal128 ),同样是 GCC 自己的扩展,接下来也准备在 C23 转正。
(至于 C++会不会引入,那就又可以看好戏了)

VLA 被 C99 转正之后,C++有人提议支持引进,并提供容器包装:
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3662.html
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0785r0.html

但最后都未能进入 C++标准。

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

https://www.v2ex.com/t/851873

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

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

© 2021 V2EX