没有使用new运算符的动态数组?

4
自从什么时候这是有效的语法?(在使用g ++ 4.6.3时有效)我应该搜索什么以获取更多关于此的信息(我习惯于使用new/delete)?
#include <iostream>

int main(){
    size_t sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    float dynamic_arr[sz];

     //output the (uninitialized) value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
     return 0;
}

1
查找“可变长度数组”。 - cnicutar
1
我正在努力想一个std::vector<float> dynamic_arr(sz);不能为您工作的原因,但我想不出来。嗯,对于sz == 0,我想你会很困扰,但是如果使用VLA,您的代码也会一样,所以...没什么问题。 - WhozCraig
我正在查看的代码在数组上使用了__attribute__(aligned(32))以针对IPP库进行优化;因此作者更喜欢使用固定大小的数组。 - Dave
2个回答

8

变长数组(VLAs)不是标准的C++,而是编译器扩展。如果您希望代码具有可移植性,则不应使用它。

如果您使用-Wvla -Werror标志或-Werror=vla编译,则代码将产生以下错误:

error: variable length array 'dynamic_arr' is used [-Werror=vla]


我认为VLA(可变长度数组)总体上来说是个坏主意(特别是当通过用户输入创建时),但这并不像你的观点那样绝对。 - Ed S.
@EdS。我必须同意。代码应尽可能符合标准。 - juanchopanza

1

标准C++不支持C99和g ++的可变长度数组(VLAs)。

在标准C++中,您可以使用例如std::vector,像这样(已修改您的代码):

#include <iostream>
#include <vector>

int main(){
    int sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    std::vector<double> dynamic_arr( sz );    // Initialized to zeroes.

     //output the value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
}

此外,对于字符串,您可以使用 std::basic_string,通常通过 typedef std::stringstd::wstring 来使用。一般来说,主要问题只是动态大小,如上所述,然后 std::vectorstd::basic_string 可以很好地解决这个问题。但是,有时问题是效率,如何对动态大小数组进行极其高效的堆栈分配。许多 C 和 C++ 实现支持非标准函数 alloca 来完成这项任务,但不幸的是,它们在处理失败时差异很大。据我所知,也没有常见的库解决方案。但令人欣慰的是,我所知道的主要用途(尽管如上所述,alloca 可用于许多平台)是在 Windows 中进行字符串编码转换,随着时间的推移和 Windows 程序越来越趋向纯 Unicode 导向,这一点变得越来越不相关了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接