gpt4 book ai didi

c++ - 如何在现代C++中创建庞大的数组?

转载 作者:行者123 更新时间:2023-12-02 10:32:25 24 4
gpt4 key购买 nike

我想为大量数据(例如int)创建数组。
该阵列将表示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_MAX / 2的一维数组?

    最佳答案

    How to create a huge array in modern C++?



    使用动态分配1。在标准的托管C++中,通常使用 std::vector创建它。

    I cannot use STL as it will be run with CUDA.



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

    int* arr = new int[SIZE]


    您是否确定 new[]的使用不受限制,原因与容器的使用受到限制的原因相同?我希望如果没有容器,就不能选择 new[]。目前尚不清楚您的限制是什么。

    无论如何,您不应该使用裸拥有的指针。使用容器或至少使用智能指针。

    int** arr = new int*[DIM1]


    如果您需要具有不同长度的行或需要交换行,这将很有用(忽略对所有权的使用裸指针是不好的)。否则,这相对于一维数组没有任何优势。

    Is it possible to create one dimensional array with bigger than INT_MAX/2 length?



    假设32位 intINT_MAX/2将为1 GB。只要您有可用的内存,在64位系统上就没有问题。在32位系统上,可能只是勉强可用,但您可能没有足够的内存。

    but I usually create int* with cudaMallocManaged and then fill it from file. So std::vector won't help here because I don't even have to use it



    如果您使用 cudaMallocManaged,那么您将不会使用 new[],因此在这里也无济于事。

    1除非阵列太大,否则无法将其整体保存在内存中,因此必须在文件系统中将其创建为文件。

    关于c++ - 如何在现代C++中创建庞大的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61779180/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com