Разработка программ с оверлеями
Этот раздел содержит важные сведения о разработке программ с
оверлеями с хорошими характеристиками.
При компиляции оверлейного модуля вы должны использовать
большую модель памяти (medium, large или huge). При всяком вызове
функции из оверлейного модуля вы обязаны гарантировать, что все
активные в текущий момент функции являются дальними.
Вы обязаны компилировать все оверлейные модули с параметром
-Y, что обеспечит оверлейную структуру генерируемого кода.
Невыполнение требования дальних вызовов в оверлейной программе приведет при выполнении программы к непредсказуемым и возможно, катастрофическим результатам.
Размер оверлейного буфера по умолчанию в два раза превышает
размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Однако, представим себе
ситуацию, когда какая-либо функция программы реализована несколькими модулями, каждый из которых является оверлейным. Если общий
размер этих модулей превышает размер оверлейного буфера, то если
модули часто вызывают друг друга, это приведет к интенсивному
свопингу.
Очевидно, что решение здесь заключается в увеличении размера
оверлейного буфера до таких размеров, чтобы в любой момент времени в нем помещались все часто вызывающие друг друга оверлеи. Это
можно сделать, установив через глобальную переменную _ovrbuffer
требуемый размер в параграфах. Например, для установки размера
оверлейного буфера равным 128К, включите в ваш код следующий оператор:
unsigned _ovrbuffer = 0x2000;
Общей формулы для определения идеального размера оверлейного
буфера не существует.
Не создавайте оверлейных модулей, содержащих обработчики
прерываний, а также в случаях небольших или критичных к быстродействию программ. Вследствие нереентерабельной природы операционной системы DOS модули, которые могут вызываться функциями прерываний, не должны быть оверлейными.
Программа управления оверлеями Borland C++ полностью поддерживает передачу оверлейных функций как аргументов, присвоение и
инициализацию переменных типа указателя функции, адресующих оверлейные функции, а также вызов оверлейных подпрограмм через указатели функций.