代码摘要:在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
答案 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
成员存储在“结构的这些字节”中等等。