C ++中的手动内存管理

时间:2014-02-18 17:39:05

标签: c++ arrays pointers memory nested-loops

代码摘要:在3d数组中存储超过1600万uint8_t作为指向那些uint8_t的指针。

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

通过“使用整数运行相同的代码”我实际上做了“查找和替换:uint8_t with 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

2 个答案:

答案 0 :(得分:3)

回答问题1)......这个循环永远存在:

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

确实,uint8_t可以表示的数字范围是0...255。所以不要在这里使用uint8_t

在我看来,由于你的计算机正在分配这个循环,它最终会占用所有内存,因此问题2)真的没有意义。

答案 1 :(得分:0)

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

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

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