我使用以下代码创建动态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位指针?或者另一种解决空间复杂性的方法?我不想使用矢量矢量,因为我的教授没有要求它。
答案 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)
}
};