如何创建一个节省内存的网格类?

时间:2014-04-13 17:32:29

标签: c++ arrays memory

大多数情况下,在C ++中创建对象网格的方式如下:

class Grid {
private:
    GridObject[5][5];
};

但有没有办法节省内存而不使用其中没有任何内容的磁贴?说你有一个国际象棋棋盘。如果您不想在未占用的空间中使用内存怎么办?我正在考虑如何做到这一点,但效率低下。

3 个答案:

答案 0 :(得分:2)

我的结构如下:

class GridObjectWithIndex
{
public:
    size_t index;
    GridObject obj;
};

其中index是x + y * GRIDSIZE形式的值,以便您可以轻松解码xy

Grid班级中有:

class Grid
{
    std::vector<GridObjectWithIndex> grid_elements;
};

答案 1 :(得分:0)

我想到的第一件事就是在网格中存储指针GridObject *。对于不存在的元素,它仍将消耗sizeof(GridObject *)字节,但它可以使您免于管理数据结构的噩梦。如果它不是绝对关键 - 不要让它比需要的更复杂。国际象棋绝对不值得(8x8)。

如果您在各种指数中拥有少量元素,那么fritzone的解决方案将会很好。但请考虑读/写性能。

如果您想在通过网络发送或保存文件时节省空间,可能需要考虑归档算法。 Althogh只对大数据集有意义。

答案 2 :(得分:0)

您要求的是稀疏数据结构,最引人注目的例子是稀疏矩阵

我们的想法是为CPU交换内存:以更多操作为代价使用更少的内存。一般来说,这意味着:

  • 具有仅代表&#34;异常&#34;值(通过坐标快速访问)
  • 保持&#34;通常&#34;抛开价值

作为概念验证,您可以使用std::map< std::pair<size_t, size_t>, Object >作为稀疏结构,只要Object中没有map,就可以使用另一个{{1}}