перераспределение увеличивает выделение только в степени 2

#objective-c #ios #realloc

#objective-c #iOS #перераспределение

Вопрос:

Когда я использую перераспределение в своем приложении для iOS, кажется, что оно всегда увеличивает объем памяти в моем приложении на 2 вместо того, что я указываю.

Это вызывает некоторые проблемы, когда я сравниваю размер выделения с размером объектов, которые он хранит.

Так ли разработан перераспределение или я что-то делаю не так?

 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
  

Ответ №1:

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

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

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

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

Ответ №2:

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