c++ 使用数组减少内存

Posted

技术标签:

【中文标题】c++ 使用数组减少内存【英文标题】:c++ Memory reduction with arrays 【发布时间】:2014-11-07 18:51:31 【问题描述】:

我正在创建一个基于块的游戏,我想改进它的内存使用。 我目前正在使用sizeof() 8 创建块。我无法减小它的大小。

块:

...
bool front, back, left, right, top, bottom;//If the face is active, true

BYTE blockType;
BYTE data;

我想出了一个解决方案,但我不知道如何正确实现它,因为我对 c++ 还很陌生。解决方案: 所有空气块完全相等,但每个占用 8 个字节的内存。如果我可以设置所有空气块,指向同一块内存,这应该(我猜)使用更少的内存。 (除非指针地址占用 8 个字节?)

目前我的数组如下所示:

块:

Block*** m_pBlocks;

Chunk::Chunk()

    m_pBlocks = new Block**[CHUNK_SIZE];
    for(int x = 0; x < CHUNK_SIZE; x++)
        m_pBlocks[x] = new Block*[CHUNK_HEIGHT];
        for(int y = 0; y < CHUNK_HEIGHT; y++)
            m_pBlocks[x][y] = new Block[CHUNK_SIZE];
        
    

我知道你不能将这些指向 null 或指向其他东西,所以我应该怎么做?

【问题讨论】:

1.为什么这里的内存使用是个问题? 2. 指针通常为 4 字节(在 32 位平台上)或 8 字节(在 64 位平台上)。添加指针会使您的内存使用更糟,而不是更好。为什么不只分配一个大块并摆脱指针? 一个指针占用8位内存,你是说64位系统8字节内存? @Duckdoom5:不,不完全是。您在这里有三个级别的分配。在两个级别上,它们是指针数组。 @LightnessRacesinOrbit 啊,我明白了,所以如果我使用:Block m_pBlocks[32][64][32] 会删除指针? @Duckdoom5:并且你不必在循环中搞乱new[]delete[]。 :) 【参考方案1】:

使用位域来减小 Block 的大小。

class Block 
  // bit fields, reduce 6 bytes to 1
  unsigned char front:1, back:1, left:1, right:1, top:1, bottom:1;//If the face is active, true

  BYTE blockType;
  BYTE data;
  // optional alignment to size 4.
  // BYTE pad;
;

Block m_pBlocks[32][64][32]; // 32*64*32=64K * sizeof(Block)=256K that is a lot.

是的,使用 8 字节的指针并不是真正的保存。

但是有几种方法可以帮助节省更多,如果您有一个高度图,那么高度图上方的所有东西都是空气!所以你只需要一个二维数组来检查,其中元素是高度。高度图下方的所有空气体素必须与其他非空气元素一起定义。

其他数据结构通常更节省空间,例如 Octree 或 Sparse voxel octree。

【讨论】:

【参考方案2】:

如果您不需要修改这些块,您可以创建一个查找图。 请不要使用 new,并尽可能避免使用指针。

bool lookup[CHUNK_SIZE][CHUNK_HEIGHT];

Chunk::Chunk()

    for(int x = 0; x < CHUNK_SIZE; x++)
      for(int y = 0; y < CHUNK_HEIGHT; y++)
        lookup[x][y] = true;

现在您可以查询查找表以查看您是否有特定的块集。 此外,您现在将所有这些值放在一起,这对性能很有好处。

【讨论】:

以上是关于c++ 使用数组减少内存的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用函数为二维数组分配内存时出错

在 C++ 中使用动态内存分配创建二维数组

C++数组在内存中的分配

c++中二维数组的内存分配

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

在函数 C++ 中分配内存二维数组