【发布时间】:2014-01-04 07:16:15
【问题描述】:
假设在一个问题中我们必须声明一个 n 大小的数组,其中1 <= n <= 1000000000
有两种(可能更多)方法可以做到这一点:
-
int arr[1000000001];并且可以根据输入的需要使用空间。 -
可以先询问用户数组的大小,然后实例化数组:
cin>>n; int arr[n];
我想知道这两种方法的优缺点是什么。
【问题讨论】:
假设在一个问题中我们必须声明一个 n 大小的数组,其中1 <= n <= 1000000000
有两种(可能更多)方法可以做到这一点:
int arr[1000000001]; 并且可以根据输入的需要使用空间。可以先询问用户数组的大小,然后实例化数组:
cin>>n; int arr[n];
我想知道这两种方法的优缺点是什么。
【问题讨论】:
两种方法的区别在于:
第一种方法符合标准,第二种方法不符合标准。 C++ 标准不允许变长数组。编译器支持它们作为扩展,但严格意义上的使用不可移植。
第一种方法的风险在于,即使不需要,也可能会耗尽堆栈空间或浪费内存。在这种情况下,最好的解决方案是使用std::vector。
【讨论】:
vector::operator[] 将使用任何现代、体面的编译器和 stdlib 实现优化为单指针算术 + 加载或存储指令)。然而,如果这个实际上是瓶颈,那么你总是可以选择operator new。