Страница 22 из 25 Эффективность Эффективность выполнения сгенерированного кода рассматрива- лась как основная задача механизмов абстракции. Общее предположе- ние состояло в том, что, если программа может быть сделана более эффективно без использования классов, многие программисты предпочли бы более быструю программу. Аналогично, если программа может быть сделана меньшей по объему без использования классов, многие программисты предподчтут более компактное представление. Ниже продемонстрировано, что классы могут быть использованы без малейшей потери эффективности или компактности представления данных в сравнении с программами , написанными на "старом" С. Упор на эффективность привел к отказу от возможностей, требующих сборки мусора.В компенсацию этого была предусмотрена возможность перегрузки для того, чтобы позволить полностью внедрить управление памятью в класс. Болееа того, было предусмотрено, чтобы программист с легкостью мог предусматривать специальные функции по управлению свободной памятью. Как было описано выше, конструкторы и деструкторы могут быть использованы для того, чтобы управлять созданием и уничтожением объектов класса. В дополнение к этому могут быть описаны функции o p e r a t o r n e w ( ) и o p e r a t o r d e l e t e ( ) для переопределения операций n e w и d e l e t e. Класс, не использующий виртуальные функции, использует в точности столько же памяти,а как и структуры С с такими же данными. Нет никакого скрытого расхода памяти на каждый объект. Нет и никаких издержек памяти на класс в целом. Составляющая функция ничем не отличается от других функций по своим требованиям по памяти. Если класс использует виртуальные функции, имеется перерасход памяти на один указатель на объект и один указатель на каждую виртуальную функцию. Если вызывается (невиртуальная) составляющаяа функция, например a b . f ( x ) адрес объекта передается как скрытый аргумент : f ( & a b , x ). Таким образом, вызов составляющей функции по меньшей мере столь же эффективен, как и вызов любой другой функции. Вызов виртуальной функции p - = f ( x ) , к примеру , эквивалентен косвенному вызову и к и Ё - - virtual - ¦ ¦ й й ( p,x ). Обычно это требует на ¦ обращения к памяти больше, чем вызов эквивалентной невиртуальной функции. Если издержки вызова функции неприемлемы для операции над объектом класса,а операция может быть реализована как включаемая функция, таким образом достигая такой же эффективности выполнения, как если бы доступ к объекту осуществлялся непосредственно. |