Распределение памяти и бесплатно - PullRequest
0 голосов
/ 11 марта 2011

Можно ли выделить 7 байтов памяти и просто освободить первые 3 байта для формирования 4-х байтового блока через любые API-интерфейсы Windows.

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

Вы можете использовать memmove(), чтобы переместить последние четыре байта в начало выделенного блока, а затем использовать realloc(), чтобы уменьшить его до четырех байтов.

Но зачем тебе это? Вы всегда можете просто получить еще один указатель на последние четыре байта памяти, например:

typedef unsigned char uint8;

uint8* psevenbytes = (uint8*)malloc(sizeof(uint8) * 7);

if (psevenbytes != NULL)
{
    uint8* pfourbytes = psevenbytes + 3;

    // ... do stuff

   free(psevenbytes);
   psevenbytes = NULL;
}

Или вы можете использовать struct.

2 голосов
/ 11 марта 2011

Нет.API распределения кучи Windows должны возвращать значение, которое выровнено естественным образом (другими словами, адрес блока% sizeof (void *) == 0).Для 32-битного процессора это означает, что каждое распределение выровнено на 4 байта.Если бы был способ сделать то, что вы хотите, новый перераспределенный блок был бы выровнен по 3-байтовой границе (начальный 7-байтовый блок был бы выровнен по 4-байтовой границе, добавление 3 байтов создает 3-байтовый выровненный указатель.

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

1 голос
/ 11 марта 2011

Нет.

Но вы могли бы очень хорошо использовать memmove и realloc, чтобы уменьшить объем используемой памяти:

memmove(ptr, ptr + 3, 4);
ptr = realloc(ptr, 4)

Но это, скорее всего, медленнее, чем просто держать память вего первоначальный размер.

...