Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Предкомпилированные заголовки

Поиск


Так как содержимое стандартных заголовков не изменяется, то их компиляция при каждой сборке проекта является напрасной тратой времени. Предкомпилированные заголовки помогают решить эту проблему – стандартные файлы компилируются один раз, а затем используется скомпилированный двоичный образ.

 

Предварительно откомпилированные заголовки – в средах программирования на языках С и С++ – способ ускорить компиляцию программ за счёт предварительной обработки так называемых заголовочных файлов, которые содержат интерфейсы модулей и, согласно нормам данных языков программирования, подключаются к программе путём прямой вставки их текстов в тело основной программы с помощью специальной директивы препроцессора #include. Предкомпилированные заголовки сохраняются на диске в виде файлов во внутреннем формате компилятора и при повторных компиляциях проекта время на их обработку и подключение существенно сокращается.

Впрочем, предварительная компиляция заголовка помогает не всегда:

1. При изменении любого из предкомпилируемых заголовков перекомпилируется весь набор.

2. При полной перекомпиляции выигрыш по времени получается, когда один и тот же набор применяется как минимум в двух единицах компиляции.

Поэтому, как правило, в предкомпилируемый набор включают всевозможные библиотечные заголовки, крупные и в то же время редко изменяющиеся.


Принцип действия предкомпилированных заголовков


Для управления предкомпилированными заголовками предназначена директива компилятора #pragma hdrstop. Все заголовочные файлы, включенные до этой директивы, помещаются в один образ, например:

 


 

#include <vcl.h>
#include <string>
#pragma hdrstop


Такая последовательность создаст образ, содержащий скомпилированные vcl.h и string. Этот образ будет использован для другого cpp-файла, если в нем до директивы hdrstop будут включены те же файлы, в том же порядке. Обращу внимание, что важен не только состав, но и порядок следования заголовков – даже если следующий cpp-файл включает те же заголовки, но сначала указан string, а потом vcl.h, то для этого cpp-файла будет создан новый образ.


Сократить затраты на компиляцию стандартных заголовков до минимума можно только в том случае, если скомпилировать один образ, содержащий все стандартные заголовки, необходимые для проекта. Для этого нужно, чтобы:

 

- ВСЕ cpp-файлы проекта имели одинаковый блок включений до директивы hdrstop;
- в этот блок должны входить ВСЕ стандартные заголовочные файлы, необходимые для проекта.

Понятие пространства имен

 

В больших проектах наблюдается серьезная проблема – конфликт идентификаторов. Она решается с помощью пространства имен.

namespace Sys

{

int var;

void Proc();

}

 

Внутри пространства имен обращение к определенным внутри переменным и подпрограммам можно осуществлять, используя неполную форму записи:

 

var = 10;

Proc();

за пределами надо использовать полную форму записи:

 

Sys::var = 10;

Sys::Proc();

 

Для того чтобы избежать возможного конфликта идентификаторов, все определения внутри модуля следует помещать в пространство имен. Следует давать небольшой буквенный идентификатор, который будет соответствовать префиксу файла.

 

Существует возможность открыть пространство имен таким образом, чтобы можно было использовать неполную форму записи. Для этого надо написать строку:

using namespace Sys; (директива)

 

Но следует отметить, что данная конструкция является причиной многих ошибок, поэтому так писать не стоит.

Существует второй способ открыть пространство имен – это открыть его для конкретного определения:

using Sys::Proc(); (определение)

Но рекомендуется использовать Sys::Proc();

 

Идентификаторы, объявленные вне пространства имен, относятся к так называемому глобальному пространству имен, доступ к которым осуществляется с помощью оператора::

 

::Funk();

 

Для того чтобы была возможность закрыть доступ к данным и подпрограммам внутри данного пространства существует пространство имен без имени:

 

namespace

{

...

}

 

Пространства имен могут быть вложенными:

 

namespace Sys

{

namespace Local

{

int var;

...

}

...

}

Sys::Local::var = 10;

 

Замечание! Когда возникает желание объявить переменный тип данных или подпрограмму внутри пространства имен, а реализовать за пределами (или наоборот), следует поступать так:

 

Классы, функции и переменные, которые являются стандартными компонентами компиляторов С++, находятся в пространстве имен std. Это относится к заголовочным файлам без.h.

 

Сделать доступным пространство имен std для программы можно несколькими способами.

 

• Можно поместить

using namespace std;

перед определением функции в файле, в результате чего все содержимое пространства имен std будет доступно для каждой функции в файле.

• Можно поместить

using namespace std; в определении функции

using std::cout;

• std::cout.

 

Пространства имен могут находиться на глобальном уровне или внутри других пространств имен, однако они не могут быть помещены в блок. Следовательно, имя, объявленное в пространстве имен, по умолчанию обладает внешним связыванием (если оно не ссылается на константу).

 

Пространства имен открыты. Это означает, что можно включать новые имена в существующие пространства имен.

 

Предположим, что одно и то же имя определено как в пространстве имен, так и области объявлений. При попытке применить объявление using, чтобы поместить имя из пространства имен в область объявлений, оба имени вступят в конфликт, и отобразится сообщение об ошибке. Если с помощью директивы using перенести имя из пространства имен в область объявлений, локальная версия этого имени перекроет версию из простраства имен.

 

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

 

14. Классы в языке C++. Наследование. Конструкторы и деструкторы. Стандартные конструкторы. Создание объектов по значению (на стеке) и по ссылке (в динамической памяти). Операторы new и delete. Размещающий оператор new. Порядок конструирования и разрушения объектов. Вложенные определения классов. «Друзья» класса. Статические члены класса.

 

Спецификация базового типа выполняет три вещи:

• Определяет, сколько памяти нужно объекту.

• Определяет, как интерпретируются биты памяти.

• Определяет, какие операции, или методы, могут быть применены с использованием этого объекта данных.

 

Классы в С++

Классы в С++ определяются с помощью одного из ключевых слов: class или struct.

 

 

Атрибуты доступа в классах: public, protected, private. Их можно чередовать.

 

В работе секций protected и private в Delphi и C++ есть различия:

ƒ В Delphi классы внутри одного модуля могут обращаться к данным и подпрограммам друг друга без ограничений. А действие секций protected и private распространяется только за пределами данного модуля. В С++ действие этих секций распространяется на любые два класса. Но установленные ограничения можно обойти с помощью специального оператора friend:

Class TTextReader

{

friend class TList;

};

 

После этого объект класса TList может обращаться к полям из секций private и protected класса TTextReader.


 

Метод класса может быть реализован по месту или отдельно от класса:

 

class TTextReader

{

public:

TTextReader();

~TTextReader() {... } // по месту

};

TTextReader::TTextReader() // отдельно от класса – квалифицированное имя

{

...

}

 

Если класс описан в интерфейсной части модуля, его методы рекомендуется реализовывать отдельно от класса в cpp-файле, иначе при компиляции получаются огромные объектные модули. В том случае, когда некоторый класс надо сделать inline -методом, следует писать так:

 

class TTextReader

{

public:

TTextReader();

~TTextReader();

int ItemCount();

};

inline int TTextReader::ItemCount()

{

...

}

Любая функция внутри определения класса автоматически становится встроенной.



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 473; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.200.121 (0.008 с.)