【发布时间】: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 个字节(我知道它会比这多一点),我希望相应数组大小的以下内存值。我将观察到的实际内存分配放在旁边:
- 500x500 - 预期 15.5 Mb - 实际 26.8 Mb
- 1000x1000 - 62 Mb 预期 - 124 Mb 实际
- 2000x2000 - 预计 288 Mb - 实际 435.8 Mb
观察到的内存分配是通过在上述函数之前和之后检查程序的内存使用情况来发现的。
所以我想我的问题是这种内存差异是否在意料之中,或者我是否在某个地方搞砸了。
像往常一样,非常感谢任何和所有帮助!
【问题讨论】:
-
您在分配中使用了两次
sizeof(MapData),应该是一次。是指针的大小。 -
您的代码中没有“
struct数组”。您只有一个“指针数组”,它需要更多内存并使用更复杂的操作来访问每个struct。成为三星级程序员不是对 C 的恭维!我总是想知道为什么初学者害怕从函数返回值,而是传递指针。 -
谢谢大家,我将第一个 calloc 更改为 sizeof(int),一切仍然运行正常,并且减少了几 Mb!感谢您帮助我理解指针位,我可以理解为什么现在需要这么多额外的内存。干杯!
-
calloc(sizeof(int))肯定是错误的,因为它假定指针与 int 大小相同。