动态二维数组:空间问题

时间:2012-12-31 13:51:08

标签: c++

我使用以下代码创建动态2D数组。

uint32_t** arrays = new uint32_t*[1000]; 
uint32_t number = take input from console ;
arrays[0] = new uint32_t[number];
number = take input from console ;
arrays[1] = new uint32_t[number];
delete arrays[0] ;
number = take input from console ;
arrays[0] = new uint32_t[number] ;

我正在使用64位Unix机器来执行上面的代码。

在上面的代码中,机器使用64位指针指向第二维数组,这就是代码占用更多空间的原因。

任何人都可以帮助我,如何转换代码因此需要32位指针?或者另一种解决空间复杂性的方法?我不想使用矢量矢量,因为我的教授没有要求它。

4 个答案:

答案 0 :(得分:2)

实际上,您的代码已经完全按照内存进行了优化。

在第一行中分配1000个64位指针。这是不可避免的,因为这是您的机器使用的。但是,这只需要8000字节,这些日子几乎不值得优化。

在接下来的行中,为int32_t数组动态分配空间,每个条目只占用4个字节。因此,如果您分配3000万个条目,则需要120.000.000个字节。我认为你错误地认为这个二级数组将占用3000万* 8字节= 240.000.000字节,但事实并非如此。只有指针是64位,数据本身将占用所需的空间。

附录:我想补充说,正如一些人所建议的,分配二维数组实际上会浪费更多内存,因为你显然不知道每个二级条目的长度。您的解决方案仅根据需要分配尽可能多的空间。

答案 1 :(得分:1)

您无法控制系统上的指针大小。

选择不关心,或者更好的是,使用实际的2D数组而不是指针数组。

答案 2 :(得分:1)

这可能是一个疯狂的想法,但不仅如此,你的问题也不是最标准的。

为什么不仅使用堆基地址的偏移量?您将被限制为32位堆地址空间(4GB堆),但如果您不想放弃64位指针所需的额外4个字节,那么这将是一个限制,您将很难克服。

想法是获取堆的基地址(可能,即使不是非常简单),它在一个全局变量中 - 让我们称之为heap_base ......或类似的东西。

现在,当你创建一个指针时,不要将它的整个值存储在第一个数组中,只存储它与heap_base的偏移量(差值)。
如果要访问元素,请使用添加恢复正确的指针值。

这可能不起作用 - 这取决于操作系统如何在堆上分配数据 - 但我认为它可能会给你一个很好的解决方案。

答案 3 :(得分:0)

另一个(更多f *#@& d up方式)来看它是使用1 64位指针来存储2个32位数。所以有64位数的数组,然后在每个元素中存储两个32位数。

然后编写单独的方法,使用位操作和其他方式将这些方法作为32位值进行访问,例如你的得到的东西会像。


uint32_t get (int i, int j)
{
   if (j % 2 == 0) 
    {
      return array[i][j/2] % (2^32)
    }
    else
    {
      return array[i][j/2] / (2^32)
    }
};