2012-12-31 59 views
1

我正在使用以下代码创建动态二维数组。动态二维数组:空间问题

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位指针?或者另一种解决空间复杂性的方法?我不想使用矢量矢量,因为它不是我的教授要求的。

+0

买不起64位指针? – billz

+0

还有其他方法吗? @billz。 – alessandro

+0

以32位模式编译。 – Mat

回答

2

实际上,你的代码已经很好地优化了内存。

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

在下一行,动态地对int32_t阵列,其中只有每取入口4个字节分配空间。所以,如果你分配3000万条目,它将需要120.000.000字节。我认为你错误地认为这个辅助数组需要3000万* 8字节= 240.000.000字节,但事实并非如此。只有指针是64位的,数据本身会占用它所需的多少空间。

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

1

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

选择不关心或更好地使用实际的二维数组而不是指针数组。

+0

正如你所说的使用2d数组而不是指针数组会减少内存需求。这是古老的'数组和指针是一样的'神话再次出现。 – Will

+0

如何使用“实际二维数组”与动态二维与出指针?第一维度将会更大(约30百万)。 – alessandro

+0

'new uint32_t [1000 *(您的输入来自控制台)];并且在需要数组访问时平展/展开2D索引。 –

0

其他(而更F *#@ &卯起来的方式),以看它是使用64位1个指针存储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) 
    } 
}; 
 
+0

抱歉,上面的代码只是一个例子。根据输入可以在第二维存储超过2位的32位数。 – alessandro

1

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

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

的想法是让你堆的基地址(可能的,即使不能完全简单),它在一个全局变量 - 让叫它heap_base的...或者类似的东西。

现在,当您创建一个指针,不存储它的第一个数组中的整体价值,只有存储是其偏移heap_base的(差)。
当你想访问一个元素时,用加法恢复正确的指针值。

这可能无法正常工作 - 这取决于操作系统将如何分配在堆上数据 - 但我想它可能给你一个解决方案一个不错的主意。