Умный (?) Трюк, чтобы избежать фрагментации кучи - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю с обработкой изображений в C ++ и иногда сталкиваюсь с проблемами памяти из-за фрагментации кучи (по крайней мере, я думаю, что фрагментация является проблемой)

Допустим, класс изображений выглядит следующим образом (псевдокод)

    Image::Image(fileList): // ImageStack constructor
      nextStackMember_(NULL), 
      fileName_(""),
      intVar1_(0),
//
//
      intVar10_(0);
      bitmap_(NULL)
{
  // Code to initialize all attributes except bitmap_
  // bitmap_ is created from fileName when actually needed
}

Существуют методы-члены для выгрузки и загрузки bitmap_. Если бы при создании конструктор инициализировал bitmap_ всех членов, я бы создал кучу, подобную этой:. ---. ------ .--.----------.-- и так далее "."крошечное пространство кучи, занимаемое атрибутами, "---" - большое пространство кучи, занимаемое растровыми изображениями.Если стек содержит, скажем, 1000 изображений, он может использовать всю доступную кучу.В этом случае сброс bitmap_ может не позволить программе создать новое изображение, поскольку все загруженные изображения могут быть меньше.Даже если я перед созданием нового изображения выкидываю ВСЕ загруженные изображения (при очистке их bitmap_ куча будет полностью фрагментирована.

Теперь перейдем к «умной» части: загружая только bitmap_s после каждого изображения в стекесоздал я должен получить кучу, которая выглядит следующим образом: ......… ..------------------------------------- таким образом все остальные атрибуты будут плотно прилегать друг к другу в куче, и я мог бы легко создать области кучи, достаточно большие для любого нового размера изображения, которое я хочу создать.

Это не похожеработать так, как я надеялся. Что я сделал не так или я совершенно не на том пути?

edit: есть ли возможность в VisualC получить визуализацию кучи работающей программы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...