【问题标题】:dynamic array without new operator? [duplicate]没有新运算符的动态数组? [复制]
【发布时间】:2013-02-06 00:49:05
【问题描述】:

这种有效的语法是从什么时候开始的? (使用 g++ 4.6.3 工作) 我应该搜索什么以找到有关此的更多信息(我习惯于新建/删除)?

#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;
}

【问题讨论】:

  • 查找“变长数组”。
  • 我在想一个原因 std::vector&lt;float&gt; dynamic_arr(sz);为你工作,但它不会来找我。好吧,对于sz == 0,我想你会被搞砸的,但你的代码也会是VLA,所以..是的。什么都没有。
  • 我正在查看的代码在数组上使用 __attribute__(aligned(32)) 来针对 IPP 库进行优化;因此作者更喜欢固定大小的数组。

标签: c++ arrays memory-management


【解决方案1】:

Varialbe 长度数组 (VLA) 不是标准 C++,它们是编译器扩展。如果您希望代码可移植,则不应使用它。

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

错误:使用了可变长度数组“dynamic_arr”[-Werror=vla]

【讨论】:

  • 我会说 VLA 通常只是一个坏主意(尤其是通过用户输入创建时),但这并不像您的观点那样绝对。
  • @EdS。我将不得不同意。代码应尽可能符合标准。
【解决方案2】:

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

在标准 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,通常通过 typedefs std::stringstd::wstring

通常主要问题只是动态大小,如上所述,然后std::vectorstd::basic_string 很好地完成了这项工作。然而,有时问题在于效率,如何对动态大小的数组进行极其高效的堆栈分配。许多 C 和 C++ 实现为此支持非标准函数 alloca,但不幸的是,它们在处理故障的方式上存在很大差异。据我所知,也没有通用的图书馆解决方案。但令人高兴的是,我所知道的主要用途(尽管alloca 可用于许多平台)一直用于 Windows 中的字符串编码翻译,随着时间的推移和 Windows 程序越来越多,这越来越不重要了更多是纯Unicode导向的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2012-12-22
    • 1970-01-01
    • 2018-02-08
    • 2014-05-20
    • 1970-01-01
    • 2011-04-12
    • 2010-11-15
    相关资源
    最近更新 更多