V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cbdy
V2EX  ›  C

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

  •  
  •   Cbdy · 2017-02-12 10:57:14 +08:00 · 2519 次点击
    这是一个创建于 2601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前无意间看到的 c99 特性, k&r 书里没写感觉很稀奇

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

    可变长数组编译的时候是单纯语法糖展开吗?
    第 1 条附言  ·  2017-02-12 11:32:34 +08:00
    起床用 cc 和 gcc 调试了一下,确实是分配在栈上的。
    所以我很好奇,当时 c 设计的时候为何不允许可变数组,是出于性能考虑吗?
    这个特性建议使用吗?
    13 条回复    2017-02-13 10:47:13 +08:00
    mikicomo
        1
    mikicomo  
       2017-02-12 11:02:33 +08:00
    绝大多数编译器都支持了吧,这是 GCC 对 C99 的支持程度
    http://gcc.gnu.org/c99status.html
    htfy96
        2
    htfy96  
       2017-02-12 11:19:47 +08:00 via Android
    不然你怎么在栈上分配变长对象?不考虑 alloca 这类东西
    jarell
        3
    jarell  
       2017-02-12 11:25:43 +08:00
    非常有用的东西了啊
    CRVV
        4
    CRVV  
       2017-02-12 11:34:24 +08:00
    最新的 "The C Programming Language" 是 1988 年出版的,怎么可能写 C99 的特性
    jox0
        5
    jox0  
       2017-02-12 11:44:27 +08:00   ❤️ 2
    不是单纯的语法糖展开, VLA 的长度在运行时决定,开发者无法判断 VLA 的内存是分配在 stack 上还是 heap 上, GCC 会在 stack 上分配内存,长度受 SIZE_MAX 限制,无法检查内存是否分配成功,声明后无法改变长度。

    总的来说会用到的地方不多,建议尽量不要使用
    Cbdy
        6
    Cbdy  
    OP
       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
        7
    owt5008137  
       2017-02-12 16:58:25 +08:00 via Android   ❤️ 1
    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
        8
    firebroo  
       2017-02-12 18:06:20 +08:00
    微软宣称只支持 c89
    srlp
        9
    srlp  
       2017-02-12 18:09:50 +08:00 via iPhone
    可能有用,但是能不用就不要用了。而且这和 cpp 不兼容。

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

    但 alloca 本身就有很多讨论是不建议使用,因此要不要使用 VLA ,自己分析吧。我个人是觉得没有太大的用处。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1146 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 22:58 · PVG 06:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.