Преразпределение на паметта

Кой е правилният и най-добрият начин за преразпределяне на паметта? например разпределям 100 байта с функцията WinAPI HeapAlloc, след което запълвам 100 байта от тази памет с някои данни и сега искам да добавя още нови данни в края на предишния...

Какво трябва да направя? Направете ново разпределение с повече байтове и след това копирайте старо+ново на ново място и освободете стара памет? Или има някакъв начин да се разпредели нова памет в края на старите данни и след това да се копират само нови данни?


person davispuh    schedule 13.06.2010    source източник
comment
така или иначе преразпределянето не е действие без излишни разходи, така че трябва да ограничите броя на необходимите преразпределения... ако знаете, че трябва да добавите N байта след 100 байта, разпределете N+100 в началото и избягвайте преразпределението; ако знаете, че може да имате нужда от N количество допълнителна памет за данни, разпределете 100+N*m, където m е избрано според вашата нужда да ограничите вероятния брой преразпределения и допълнително използване на паметта за едно и също време...   -  person ShinTakezou    schedule 13.06.2010


Отговори (2)


Вероятно трябва да използвате HeapReAlloc, тъй като Windows без съмнение ще има оптимизации, ако може просто да разшири паметта, без да копира данни.

Например, виждал съм реализации на realloc (стандартния C), който проверява дали текущият блок може просто да абсорбира свободен блок след него. Ако е така, той прави това, за да избегне операция за копиране. Ако не, той разпределя новата памет и прави копирането, преди да освободи старата.

Друго предимство на това е, че минимизирате необходимата допълнителна памет. При версия за копиране трябва да имате две копия на текущите данни, съществуващи в даден момент.

person paxdiablo    schedule 13.06.2010
comment
Благодаря, сега ще го пробвам :) - person davispuh; 13.06.2010

HeapReAlloc?

person Andreas Rejbrand    schedule 13.06.2010