2014-02-18 65 views
0

代码摘要:在3d数组中存储超过1600万个uint8_t作为指向那些uint8_t的指针。C++中的手动内存管理

代码有效,但为什么我只使用uint8_t而不是int保存4 KB。我运行这个相同的代码,它使用330,488K的int,但使用uint8_t它使用330,484。我知道大部分是指针,但不应该(假设每个int使用最小空间)将每个1600万个整数的大小从2个字节减少到1个字节,节省了超过4k个?我认为它应该已经保存到接近16 MB了吗?

通过“运行相同的代码与整数”我从字面上做一个“查找和替换:uint8_t与int”然后重新编译。

uint8_t**** num3d; 
num3d = new uint8_t***[256]; 
for(int i=0;i<256;i++){ 
    num3d[i] = new uint8_t**[256]; 
    for(int j=0;j<256;j++){ 
     num3d[i][j] = new uint8_t*[256]; 
    } 
} 

// Initialize 
uint8_t *B; 
for(int lx = 0;lx<256;lx++){ 
    for(int ly= 0;ly<256;ly++){ 
     for(int lz=0;lz<256;lz++){ 

      if(ly == 0 || lx == 0 || lz == 0 || ly == 255 || lx == 255 || lz == 255){ 
       B = new uint8_t(2); 
       num3d[lx][ly][lz] = B; 
       continue; 
      } 
      if(ly < 60){ 
       B = new uint8_t(1); 
       num3d[lx][ly][lz] = B; 
       continue; 
      } 
      B = new uint8_t(0); 
      num3d[lx][ly][lz] = B; 

     } // inner inner loop 

    } // inner loop 

} // outer loop 
+8

我刚看到这个,并且被这个'uint8_t **** num3d;'o_o – Netwave

+1

_'...惊奇,我知道他们必须将内存管理包含在uint8_t未包含的正常整数中。 ...'_你的2个问题中的大多数都是以某种方式写的,我根本无法推断出你真正的问题是什么(我很确定这些问题是你要求的)。 –

+2

两个字:封装和抽象。 *那是你必须学习的东西。然后内存管理自己。 –

回答

0

“我的问题是关于int的问题,它允许它使用完整的32位整数工作,并且我将如何复制程序已经使用的整数与8位整数一起使用,我知道它们必须包含内存管理转换成未包含在uint8_t中的正常整数“。

那么,int至少 16位,32位甚至没有保证。但忽略这一点,事实是每个整型都有一定的范围。 std::numeric_limits<int><uint_8>会告诉你各自的范围。很明显,你不能使用8位数字来计数从0到256.你只能计数到255.

此外,没有内存管理根本没有int和其他简单类型如uint_8。编译器只是说:“名称为Foo的整数存储在这些字节中”就是这样。不需要管理。有一些小的变化,例如一个结构的成员int被“存储在结构的这些字节中”等等。

+0

嗯好吧然后有一个记忆洞我失踪后固定循环? –

+0

对不起,我必须快速编辑一个愚蠢的评论,我在5分钟之前就做出了评论,所以我选择了上面的说法。现在由于某种原因,我在运行此代码时使用了循环的ints和指向uint8_t的指针作为数组类型,但是当我运行完全相同的代码时,我有一个内存空洞(我在整个块上执行“find and replace”并将uint8_t更改为int)boom:没有内存孔。 –

+0

Theres现在没有使用int8_t和int的内存空间,但为什么使用int8_t只能在存储1600万个int时比int节省4KB?假设每个int只存储了2个字节,它不应该保存更接近16 MB? –

3

回答问题1)...这个循环去到永远

for (uint8_t i=0;i<256;i++) 

事实上它可以是由uint8_t表示的数的范围为0...255。所以在这里不要使用uint8_t

在我看来,既然你的计算机正在分配这个循环,它将最终吃掉所有的内存,因此问题2)没有任何意义。

+2

它也导致大量的内存泄漏(因为每次迭代都分配内存......永远不会被删除,但指向它会在下一次迭代中更改为新分配)。这是什么导致他耗尽记忆(我相信这是回答#2)。 –

+0

啊,谢谢!我也想出了最好的办法是在循环之前定义变量,然后删除它,而不是循环创建它。问题1解决了。 –