void59468
V2EX  ›  C++

gcc 可变长度数组

  •  
  •   void59468 · May 10, 2022 · 3475 views
    This topic created in 1469 days ago, the information mentioned may be changed or developed.

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

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

    17 replies    2022-05-11 21:54:24 +08:00
    elfive
        1
    elfive  
       May 10, 2022 via iPhone
    类似于标准库里的 alloca 函数,他也是在栈上申请的内存,不是堆里面
    inhzus
        2
    inhzus  
       May 10, 2022 via iPhone   ❤️ 2
    善用搜索引擎
    Google:gcc disable variable length array

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

    我记得人家做栈内存优化,都是先 char buffer[1024]。如果需求更大就 malloc
    Cu635
        16
    Cu635  
       May 11, 2022
    可变长度数组就是 C++引入的吧,之后 c 语言的 c99 标准看着这玩意儿挺好也就跟着引入了。
    cnbatch
        17
    cnbatch  
       May 11, 2022   ❤️ 1
    @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++标准。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3672 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 04:50 · PVG 12:50 · LAX 21:50 · JFK 00:50
    ♥ Do have faith in what you're doing.