【问题标题】:Struct array taking up too much memorystruct数组占用太多内存
【发布时间】:2016-04-24 14:51:58
【问题描述】:

我正在开发一个使用 2D 结构数组来存储地图图块属性的简单游戏。

结构体是这样定义的:

    typedef struct
    {
        //PRE-GENERATED PROPERTIES

            //Tile Type
            int TypeB;
            int TypeF;
            int TypeW;

            //Tile Roughness
            int RougB;
            int RougF;
            int RougW;

        //GENERATED PROPERTES

            //Boundary Type
            int BounB;
            int BounF;
            int BounW;
            //Boundary Rotation
            int BounRotB;
            int BounRotF;
            int BounRotW;
            //Boundary Flip
            int BounFlpB;
            int BounFlpF;
            int BounFlpW;

            //Movement Properties
            int Movement;
            int Movement_Speed;

        //RANDOMIZED PROPERTIES

            //Randomized Texture Fill
            int RandB;
            int RandF;
            int RandW;
            //Randomized Texture Rotation
            int RandRotB;
            int RandRotF;
            int RandRotW;
            //Randomized Texture Flip
            int RandFlpB;
            int RandFlpF;
            int RandFlpW;

            //Perlin (Temp)
            double PerlinSum;

    } MapData;

MapData **MapTile;

并使用以下函数创建和运行数组:

//Create Map Matrix
void CreateMapMatrix(MapData ***Map, int xSize, int ySize)
{
    //Variables
    int i;

    //Allocate Map Memory
    *Map = calloc(xSize, sizeof(MapData));

    for(i = 0; i < xSize; i++)
    {
        (*Map)[i] = calloc(ySize, sizeof(MapData));
    }

}

int = xMap = 2000, yMap = 2000;

CreateMapMatrix(&MapTile,xMap,yMap);

我的问题是这个函数运行期间和之后使用的内存与我预期的相比非常高(我假设它是与数组关联的内存)。

假设每个结构占用 68 个字节(我知道它会比这多一点),我希望相应数组大小的以下内存值。我将观察到的实际内存分配放在旁边:

  1. 500x500 - 预期 15.5 Mb - 实际 26.8 Mb
  2. 1000x1000 - 62 Mb 预期 - 124 Mb 实际
  3. 2000x2000 - 预计 288 Mb - 实际 435.8 Mb

观察到的内存分配是通过在上述函数之前和之后检查程序的内存使用情况来发现的。

所以我想我的问题是这种内存差异是否在意料之中,或者我是否在某个地方搞砸了。

像往常一样,非常感谢任何和所有帮助!

【问题讨论】:

  • 您在分配中使用了两次sizeof(MapData),应该是一次。是指针的大小。
  • 您的代码中没有“struct 数组”。您只有一个“指针数组”,它需要更多内存并使用更复杂的操作来访问每个struct。成为三星级程序员不是对 C 的恭维!我总是想知道为什么初学者害怕从函数返回值,而是传递指针。
  • 谢谢大家,我将第一个 calloc 更改为 sizeof(int),一切仍然运行正常,并且减少了几 Mb!感谢您帮助我理解指针位,我可以理解为什么现在需要这么多额外的内存。干杯!
  • calloc(sizeof(int)) 肯定是错误的,因为它假定指针与 int 大小相同。

标签: c arrays memory struct


【解决方案1】:
*Map = calloc(xSize, sizeof(MapData));

应该是:

*Map = calloc(xSize, sizeof(MapData *));

你分配了太多内存。

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2015-10-14
    • 2013-07-18
    • 2013-07-11
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多