c++创建数组

C++ creating arrays

本文关键字:数组 创建 c++      更新时间:2023-10-16

为什么我不能这样做呢?

int size = menu.size;
int list[size];

有没有别的方法来代替向量?(数组更快,所以我想使用数组)

谢谢

这个大小必须在编译时知道,因为编译器需要知道需要多少堆栈空间才能为它分配足够的内存。(编辑:我承认错误。在C语言中,可变长度数组可以在堆栈上分配。但是c++不允许变长度数组)

但是,您可以在上创建数组:

int* list = new int[size];

只是确保你释放内存当你完成,否则你会得到一个内存泄漏:

delete [] list;

请注意,很容易意外地造成内存泄漏,而vector几乎肯定更容易使用和维护。vector 非常快(特别是如果您首先将它们reserve()到正确的大小),我强烈建议使用vector而不是手动内存管理。

一般来说,分析代码以找出真正的瓶颈在哪里比预先进行微优化要好(因为优化并不总是优化)。

正如其他人所说,c++语言设计者选择不允许可变长度数组,vla,尽管它们在C99中可用。但是,如果您准备自己做更多的工作,并且您只是迫切需要在堆栈上分配内存,那么您可以使用alloca()

也就是说,我个人会使用std::vector。它更简单、更安全、更易于维护,而且可能足够快。

c++不允许变长度数组。大小必须在编译时已知。所以你不能那样做。

您可以使用向量或new

vector<int> list;

int *list = new int[size];

如果您使用后者,您需要稍后释放它:

delete[] list;

数组更快,所以我想使用数组

这不是真的。你从哪听来的?

在c++中,数组的长度需要在编译时知道,以便在堆栈上分配它。

如果需要分配一个在编译时不知道其大小的数组,则需要在堆上分配它,使用operator new[]

int size = menu.size;
int *list = new int[size];

但是,由于堆上有新内存,因此您需要确保在使用它时正确删除它。

delete[] list;

在c++ 03中,没有可变长度数组(VLA):

你可能想这样做:

const int size = menu.size;
int list[size]; // size is compile-time constant

int *list = new int[size]; // creates an array at runtime;
delete[] list;             // size can be non-const

首先,向量并不明显更快。至于你不能这样做的原因:

代码将在堆栈上分配数组。编译器必须事先知道这个大小,这样才能对其进行解释。因此,您只能使用该语法的常量。

一个简单的方法是在堆上创建数组:int list = new int[size];不要忘记delete[]。但是,如果您使用矢量并预先保留正确的大小并进行优化编译,则应该很少甚至完全没有开销。

由于list是在堆栈上分配的,因此它的大小必须在编译时知道。但是这里,size直到运行时才知道,所以list的大小在编译时是不知道的。