realloc仅以2的幂增加分配

时间:2011-10-27 06:08:51

标签: objective-c ios realloc

当我在我的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

2 个答案:

答案 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中可能非常相似。