【发布时间】:2020-08-29 21:57:06
【问题描述】:
我想为大量数据(例如整数)创建数组。
该数组将表示二维矩阵。
我不能使用 STL,因为它将与 CUDA 一起运行。
我想知道以下选项的优缺点是什么:
- int arr[SIZE] - 这是创建数组的最简单方法。它是在堆栈上分配的,因此它将是最快的 - 这里的问题是它的大小非常有限。
- int* arr = new int[SIZE]
- int** arr = new int*[DIM1] - 如果我们看效率,这是最坏的情况,但它允许存储 INT_MAX * INT_MAX 值。
我正在考虑第二种选择。我电脑上的 Sizeof(int) 是 32 位。我认为对于某些测试用例来说它可能太小了(如果我使用大于 32k x 32k 的矩阵)。
第三个选项似乎是最灵活的,但我听说这不是好的做法。
还有其他方法可以创建这样的数组( > 1B 元素)吗? 是否可以创建大于 INT_MAX/2 长度的一维数组?
【问题讨论】:
-
new int[n];操作的参数 (n) 是size_t类型(不是int),如果这有帮助的话(虽然不确定它对 CUDA 有很大的影响) )。 -
"我不能使用 STL,因为它将与 CUDA 一起运行。" 嗯,为什么不呢?您必须将数组复制到 CUDA 的内存中才能使用它,对吗?如果您的 CPU 副本分配来自
std::vector<int>或其他什么,这有什么关系? -
"我正在考虑第二个选项。我的计算机上的 Sizeof(int) 是 32 位。我认为对于某些测试用例来说它可能太小了(如果我使用大于 32k x 的矩阵32k)." 32 位 (
unsigned int) 将允许矩阵大小为 2^32 x 2^32,而不是 32k x 32k。 -
我不能使用 STL -- 你可能不知道,
new int[]是vector正在做的事情。std::vector<>::data()函数为您提供指向该缓冲区的指针。 -
@SzymonŻak "我认为这是一个 int,而不是 unsigned int。" 为什么会有人这么认为?允许负大小的数组有什么意义?如 cmets 中所述,实际大小是
size_t类型。可以大于int,或unsigned int,但绝对是unsigned。
标签: c++ arrays c++11 multidimensional-array data-structures