Только реаллок увеличивает распределение на 2 - PullRequest
2 голосов
/ 27 октября 2011

Когда я использую realloc в своем приложении для iOS, кажется, что оно всегда увеличивает память в моем приложении на степень 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 ]

5 голосов
/ 27 октября 2011

Это показатель эффективности.Арена, используемая процедурами выделения памяти, обычно имеет фиксированное «разрешение», например, шестнадцать байтов.Это потому, что они, как правило, дают вам (например) шестнадцати байтовый заголовок, за которым следует достаточно шестнадцати байтовых чанков, чтобы удовлетворить то, что вам нужно.

Таким образом, ему всего лишь нужно выделить шестнадцать байтных чанков с арены.упрощая разбиение и объединение этих кусков (при минимальной стоимости до 15 байт потерь на распределение).

Но, и это важно, даже если вы запрашиваете десять байт, и это дает вам 1 КБ, вам по-прежнему разрешено использовать только эти десять байтов!

Если вы хотите отслеживать то, что вы использовали, против того, что вы просили, это проблема, которую вам нужно решить,Не полагайтесь на информацию, возвращаемую с malloc_size для этого.

2 голосов
/ 27 октября 2011

Существует множество различных реализаций malloc, но простой ответ - это то, что malloc возвращает распределения из разных «сегментов», где каждый сегмент имеет заданный размер (или несколько).Так что, если вы попросите 26 байтов, вы, вероятно, вернете выделение 32 байта.У Cocoa With Love есть отличный пост о том, как malloc реализован в OS X, и он, вероятно, очень похож в iOS.

...