当我在我的iOS应用程序中使用realloc时,似乎它总是以2的幂而不是我指定的方式增加应用程序中的内存。
当我根据存储的对象大小检查分配大小时,这会导致一些问题。
这是realloc的设计方式还是我做错了什么?
typedef struct {
GLfloat r;
GLfloat g;
GLfloat b;
GLfloat a;
} Color;
typedef struct {
int objectID;
int modelID;
GLfloat scale;
GLfloat translation[3];
GLfloat rotation[3];
Color color;
bool render;
} Object;
Object* objects;
objects = realloc(objects, malloc_size(objects) + sizeof(Object));
NSLog(@"objects size = %lu", malloc_size(objects)); //prints 64 instead of 56
答案 0 :(得分:5)
这是一项效率措施。存储器分配例程使用的竞技场通常具有固定的“分辨率”,例如16个字节。那是因为他们倾向于给你一个(例如)16个字节的标题,然后是足够的16个字节的块来满足你的需要。
这样,它只需要从竞技场分配16个字节的块,这样就可以更容易地拆分和重新加入这些块(每次分配最多可节省15个字节的浪费)。
但是,这很重要,即使你要求10个字节并且它给你1K,你仍然只允许使用这10个字节!
如果您想跟踪您所针对的内容,那么您需要处理这个问题。不要依赖malloc_size
返回的信息。
答案 1 :(得分:2)
有许多不同的malloc实现,但简单的答案是malloc回拨来自不同“桶”的分配,其中每个桶是给定大小(或其多个)。因此,如果你要求26个字节,你可能会得到32个字节的分配。 Cocoa With Love对OS X中如何实现malloc有一个great post,它在iOS中可能非常相似。