Здравствуйте gh, Вы писали:
gh>Только сейчас пришло в голову gh>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте gh, Вы писали:
gh>>как можно высвободить оставшуюся память с 21 по 50?
DG>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.
Это понятно.
Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается.
Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.
Здравствуйте gh, Вы писали:
gh>Здравствуйте DarkGray, Вы писали:
DG>>Здравствуйте gh, Вы писали:
gh>>>как можно высвободить оставшуюся память с 21 по 50?
DG>>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.
gh>Это понятно. gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается. gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.
gh>Или тогда надо что то другое думать...
Можно написать свой класс и память выделять кусками — потом ненужные висвободить
Можно использовать системние функции Windows управления виртуальной памятю (VirtualAlloc ...)
— каждий из вариантов имеет свои +/- — выбирай
Здравствуйте gh, Вы писали:
gh>Это понятно. gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается. gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.
gh>Или тогда надо что то другое думать...
Вообще-то не знаю. Но если сделано по уму, то по возможности realloc должна избегать копирования и выделения памяти. А случай, когда буфер уменьшается — стопроцентная возможность. Достаточно просто поменять длину выделенного блока и пометить остаток как свободный.
По-моему у Рихтера напсано, что виндовская HeapReAlloc работает именно так, но в MSDN я этого что-то не заметил.
На самом деле — при realloc _может_ произойти выделение памяти в другом месте. А может и нет — все зависит от начального и конечного размеров блока, и реализации realloc в конктретном std.
Попробуй vector (resize) — они там сами алгоритм выделения памяти предоставляют. Можно и свой определить.
gh>>>как можно высвободить оставшуюся память с 21 по 50?
DG>>a = (int*)realloc (a, 20 * sizeof(int)); //20 — новый размер блока.
gh>Это понятно. gh>Только при этом, на сколько я понимаю, происходит выделение памяти в другом месте и туда происходит копирование этих 20 элиментов, а та память высвобождается. gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.
gh>Или тогда надо что то другое думать...
Здравствуйте gh, Вы писали:
gh>Здравствуйте, Люди!
gh>есть некое динамическое выделение памяти для массива, к примеру:
gh>int *a; gh>a=malloc(50*sizeof(int));
gh>а в итоге используется только первых 20 элементов.
gh>как можно высвободить оставшуюся память с 21 по 50?
Вот только непонятно — а зачем ее высвобождать? Если ты ее совсем не используешь — зачем столько выделил? А если будешь использовать в будущем ИМХО затраты на перераспределение памяти не окупятся.
gh>Только сейчас пришло в голову gh>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)
Здравствуйте gh, Вы писали:
gh>Но это помоему не очень оптимально, так как реально у меня массив гдето на 5000*16 байт и очень часто идёт выделени и перераспределение. Меня волнует вопрос об оптимальности.
Если очень часто идет перераспределение, то имеет смысл задуматься над более другой логикой распредения памяти — не в массиве. Опиши конкретнее, что у тебя за задача?
Как все запущенно...
Re[2]: частичное высвобождение памяти
От:
Аноним
Дата:
05.08.02 07:18
Оценка:
Здравствуйте SergH, Вы писали:
SH>Здравствуйте gh, Вы писали:
gh>>Только сейчас пришло в голову gh>>free(a+21); // так пойдёт или это не корректно ( нет сейчас возможности самому проверить)
SH>Не должно пройти.
Там же насколько я понимаю перед указателем на область памяти всегда стоит размер памяти выделленой malloc и при вызове free указаный объем паямяти и высвобождаеться так что дествительно free(a+21) не корректна