как сделать из слона муху ФЛЕНОВ МИХАИЛ AKA HORRIFIC Спецвыпуск: Хакер, номер #071, стр. 071-048-2 Как вариант, для хранения динамического массива указателей можно использовать класс TList (в данном случае совет относится к программистам Delphi). На самом деле, алгоритмов создания списков очень много, но мы выделили эти два, как наиболее эффективные и достаточно простые в реализации. В зависимости от задачи можно придумать и другой алгоритм: все зависит от того, как хранятся данные, нужно ли их сортировать, есть ли необходимость удалять из середины, куда добавляются новые элементы (в конец или могут вставляться в середину списка) и т.д. [по чуть-чуть.] Допустим, что ты пишешь программу воспроизведения/записи звука или видео. На первый взгляд, для воспроизведения mp3-файла необходимо столько же памяти, сколько данные занимают в файле. Достаточно только загрузить все в память и отправить данные звуковой карте. Ошибочка вышла. Не факт, что звуковая карта сможет понять сжатые данные. Придется производить декомпрессию самостоятельно и направлять звуковой карте несжатые данные. Если разложить по полочкам mp3-файл, то для хранения всех данных может понадобиться 60, а то и все 100 мегабайт памяти. Такого расточительства тебя ни один пользователь не простит. Еще один пример – простой ZIP-архиватор. Что если необходимо сжать файл размером в 500 метров? Загрузить его в память, а потом заархивировать его там будет достаточно проблематично. Во всех этих случаях вполне логичным будет выделить два небольших участка памяти. В первый необходимо загружать данные из файла для последующей манипуляции (компрессии/декомпрессии), а во второй будет помещаться результат работы. Тут нужно быть аккуратным, потому что размеры сжатых и несжатых данных разные и легко выйти за границу буфера. Не стоит пытаться запихнуть в оперативку все сразу, потому что это бессмысленно. Всегда загружай данные небольшими порциями. [циклическое использование памяти.] При работе со звуком Microsoft предоставляет нам очень удобные механизмы работы с памятью, которые мы сейчас и рассмотрим. Итак, MMSystem получает при воспроизведении и возвращает при записи звуковые данные через специализированные буферы. Так как данные загружаются порциями, для предотвращения задержек в воспроизведении/записи музыки используется очередь из буферов. Для нормальной работы достаточно двух блоков памяти, но можно сделать и больше. Как пример, выделяем память для хранения двух буферов данных. Размер памяти можно выбрать любой, но он должен быть не слишком маленьким, дабы избежать слишком частой смены буферов, и не слишком большим, чтобы сэкономить память для других целей. Точный размер подбирается в зависимости от качества звука, потому что от этого зависит и размер необходимых данных. Из личного опыта — выделяй столько, чтобы хватило на воспроизведение/запись не менее 5 и не более 10 секунд звука. |