c99 的可变长数组是单纯语法糖吗?

2017-02-12 10:57:14 +08:00
 Cbdy
之前无意间看到的 c99 特性, k&r 书里没写感觉很稀奇

平时用 Mac 下的 cc 比较多,想问问有没有人了解 c99 特性各大平台支持得如何?

可变长数组编译的时候是单纯语法糖展开吗?
2657 次点击
所在节点    C
13 条回复
mikicomo
2017-02-12 11:02:33 +08:00
绝大多数编译器都支持了吧,这是 GCC 对 C99 的支持程度
http://gcc.gnu.org/c99status.html
htfy96
2017-02-12 11:19:47 +08:00
不然你怎么在栈上分配变长对象?不考虑 alloca 这类东西
jarell
2017-02-12 11:25:43 +08:00
非常有用的东西了啊
CRVV
2017-02-12 11:34:24 +08:00
最新的 "The C Programming Language" 是 1988 年出版的,怎么可能写 C99 的特性
jox0
2017-02-12 11:44:27 +08:00
不是单纯的语法糖展开, VLA 的长度在运行时决定,开发者无法判断 VLA 的内存是分配在 stack 上还是 heap 上, GCC 会在 stack 上分配内存,长度受 SIZE_MAX 限制,无法检查内存是否分配成功,声明后无法改变长度。

总的来说会用到的地方不多,建议尽量不要使用
Cbdy
2017-02-12 11:54:07 +08:00
@jox0 我刚刚大概在爆栈 网上看了一下, VLA 的实现的时候通常是在栈上的,作用域结束或者调用栈弹出就释放了(不同 于 malloc ),引入主要是为了提供一个可以分配可变数组但是开销 比小 malloc 的特性,取代一部分 malloc 的功能。感觉确实是个好东西

>VLA were introduced as run-time-sized arrays with low allocation/deallocation cost. They fit between "ordinary" named compile-time-sized arrays (which have virtually zero allocation-deallocation cost, but fixed size) and malloc-ed arrays (which have run-time size, but relatively high allocation-deallocation cost).
http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays
owt5008137
2017-02-12 16:58:25 +08:00
VC++不会去支持 c99 特性的。而且已经被从 c++标准里移除了
其他的嘛,看看这个呗
https://gcc.gnu.org/projects/cxx-status.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3639.html
一般 gcc 支持的特性 VC++以外的其他编译器都会跟
firebroo
2017-02-12 18:06:20 +08:00
微软宣称只支持 c89
srlp
2017-02-12 18:09:50 +08:00
可能有用,但是能不用就不要用了。而且这和 cpp 不兼容。

http://stackoverflow.com/questions/1887097/why-arent-variable-length-arrays-part-of-the-c-standard
araraloren
2017-02-13 09:08:02 +08:00
不是单纯的语法糖
`C11`已经把这一条变成可选支持的了,这东西不是必须得用的,自己`malloc`吧。
linux40
2017-02-13 09:31:32 +08:00
没有标准的栈可变内存申请接口,这就是两种中的一种。。。你也可以 char[],然后 cast 。。。
linux40
2017-02-13 09:36:17 +08:00
这样要注意对齐。。。
zonyitoo
2017-02-13 10:47:13 +08:00
在 C99 之前本身就有一个 alloca 函数可以让你在栈上分配连续内存。所以这个在绝大多平台上来讲,的确就是个糖
http://man7.org/linux/man-pages/man3/alloca.3.html
https://msdn.microsoft.com/en-us/library/wb1s57t5.aspx

但 alloca 本身就有很多讨论是不建议使用,因此要不要使用 VLA ,自己分析吧。我个人是觉得没有太大的用处。

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

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

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

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

© 2021 V2EX