如何用现代C++创建一个庞大的数组?

问题描述 投票:2回答:1

我想为大量的数据(如:ints)创建一个数组,这个数组将表示2D矩阵。我不能使用STL,因为它将与CUDA一起运行。我想知道以下选项的利弊。

  • int arr[SIZE] - 这是最简单的创建数组的方法。它是在堆栈上分配的,所以它是最快的--这里的问题是它的大小非常有限。
  • int* arr = 新的int[SIZE]。
  • int** arr = new int*[DIM1] - 如果我们考虑效率的话,这是最坏的情况,但它允许存储 INT_MAX * INT_MAX 值。

我正在考虑第二个选项。我的电脑上的Sizeof(int)是32位的。我认为对于某些测试案例来说,它可能太小了(如果我使用大于32k x 32k的矩阵)。

第三个选项似乎是最灵活的,但我听说这不是好的做法。

有没有其他的选择来创建这样的数组(> 1B元素)?有没有可能创建长度大于INT_MAX2的一维数组?

c++ arrays c++11 multidimensional-array data-structures
1个回答
0
投票

如何在现代C++中创建一个巨大的数组?

使用动态分配1. 在标准的、托管的C++中,通常会使用 std::vector.

我不能使用STL,因为它将与CUDA一起运行。

你是指标准库吗?在这种情况下,解决方案是使用另一个可以与CUDA一起运行的容器。

int* arr = new int[SIZE]

你确定使用 new[] 容器的使用受到限制的原因不一样吗?我希望 new[] 不能成为一个选项,如果容器不是。不清楚你的限制到底是什么。

无论如何,你不应该使用裸露的自有指针。使用一个容器或者至少是一个智能指针。

int** arr = new int*[DIM1]

如果你需要有不同长度的行或需要交换行,这可能是有用的(忽略使用裸露指针的所有权,这是不好的)。否则这与一维数组相比没有任何优势。

是否可以创建长度大于INT_MAX2的一维数组?

假设是32位 int, INT_MAX/2 将是一GB。这在64位系统上是没有问题的,只要你有足够的内存。在32位系统上,也许只是勉强,但你可能没有足够的内存。

但我通常用cudaMallocManaged创建int*,然后从文件中填充。所以std::vector在这里没有帮助,因为我甚至不需要使用它。

如果您使用 cudaMallocManaged那么你就不会使用 new[] 所以在这里也帮不上忙。


1 除非数组需要非常巨大,以至于不能整体保存在内存中,在这种情况下,就必须在文件系统中以文件的形式创建。

© www.soinside.com 2019 - 2024. All rights reserved.