LINUX.ORG.RU

Выгрузка из памяти ненужных ресурсов / глобальных переменных.

 , ,


0

1

Возьмём например Qt. Там есть xml-файл ресурсов resources.qrc, в который можно например картинки добавлять:

<RCC>
    <qresource prefix="/">
        <file>icons/hello.png</file>
        ...
    </qresource>
</RCC>

Компиляется он в сишный сорц, где все эти картинки заинлайнены как hex-литералы в глобальную переменную:

static const unsigned char qt_resource_data[] = {                                                                                                                                           
  // /blablabla/icons/hello.png                                                                                                                     
  0x0,0x0,0xb,0x5b, ...                                                                                                                                                                 
  ...
};
...

Что печалит: вот допустим загрузил я картинку в память (в объект QImage) из ресурсов – и больше мне эти ресурсы не нужны. Но они продолжают сидеть в памяти, фактически задвоение данных картинки. А если там не картинка (которая во-первых маленькая, а во-вторых в теории может и не копировать эти данные, а тупо хранить ссылку на них с флагом owner=false), а чего пообъёмнее?

Понятно, что можно тупо хранить ресурсы в отдельном файле и грузить его вручную. Но не хочется файлы плодить. Вдруг есть какая-нибудь фича в плане сабжа? Смутно помню, что винда умеет красиво в ресурсы в PE-файлах, но мне бы под лялих.

★★★★★

Последнее исправление: dimgel (всего исправлений: 1)

Ответ на: комментарий от utf8nowhere

Сенькс. Нагуглил attribute((section(".rodata"))), авось поможет енфорсить это дело (хотя из прошлого помнится что эти attribute(()) молча игнорятся, если что не так).

Хотя механизм, по размышлению, слишком coarse-grained: вдруг в этой .rodata регулярно читается лишь один байт, но из-за него в памяти сидят остальные уже ненужные 100500 килобайт.

dimgel ★★★★★
() автор топика
Последнее исправление: dimgel (всего исправлений: 1)
Ответ на: комментарий от dimgel

Хотя механизм, по размышлению, слишком coarse-grained: вдруг в этой .rodata регулярно читается лишь один байт, но из-за него в памяти сидят остальные уже ненужные 100500 килобайт.

Разве что mmap по страницам умеет выгружать. По идее должен уметь, иначе кому нафиг такой mmap нужен.

dimgel ★★★★★
() автор топика

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

rumgot ★★★★★
()

Что печалит: вот допустим загрузил я картинку в память (в объект QImage) из ресурсов – и больше мне эти ресурсы не нужны. Но они продолжают сидеть в памяти, фактически задвоение данных картинки

а откуда следует, что там будет копирование данных? в wxImage (wxWidgets) есть конструкторы из «массива байт», но они вроде вообще ничто не копируют, а просто запоминают переданный адрес, то есть «вытеснять» ничего там нельзя.

alysnix ★★★
()