【问题标题】:realloc Only Increases Allocation by a Power of 2realloc 仅将分配增加 2 的幂
【发布时间】:2011-12-16 06:29:09
【问题描述】:

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

【问题讨论】:

    标签: objective-c ios realloc


    【解决方案1】:

    那里有许多不同的 malloc 实现,但简单的答案是 malloc 从不同的“桶”交回分配,其中每个桶是给定的大小(或多个)。因此,如果您要求 26 个字节,您可能会得到 32 个字节的分配。 Cocoa With Love 有一个great post,关于如何在 OS X 中实现 malloc,它在 iOS 中可能非常相似。

    【讨论】:

      【解决方案2】:

      这是一种效率措施。内存分配例程使用的 arena 通常具有固定的“分辨率”,例如 16 个字节。那是因为他们倾向于给你一个(例如)16 字节的头部,然后是足够的 16 字节的块来满足你的需要。

      这样,它只需要从 arena 分配 16 个字节的块,从而使这些块的拆分和重新加入更容易(每次分配最多浪费 15 个字节的小成本)。

      但是,这很重要,即使您要求十个字节并且它给您 1K,您仍然只能使用这十个字节!

      如果您想根据您的要求跟踪您使用的内容,这是您需要处理的问题。不要依赖 malloc_size 返回的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-17
        • 2020-04-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        相关资源
        最近更新 更多