10.5.1. Модель компиляции с включением
10.5.1. Модель компиляции с включением
Согласно этой модели мы включаем определение шаблона в каждый файл, где этот шаблон конкретизируется. Обычно оно помещается в заголовочный файл, как и для встроенных функций. Именно такой моделью мы пользуемся в нашей книге. Например:
// model1.h
// модель с включением:
// определения шаблонов помещаются в заголовочный файл
template typename Type
Type min( Type t1, Type t2 ) {
return t1 t2 ? t1 : t2;
}
Этот заголовочный файл включается в каждый файл, где конкретизируется функция min():
// определения шаблонов включены раньше
// используется конкретизация шаблона
#include "model1.h"
int i, j;
double dobj = min( i, j );
Заголовочный файл можно включить в несколько файлов с исходными текстами программы. Означает ли это, что компилятор конкретизирует экземпляр функции min() с целыми параметрами в каждом файле, где имеется обращение к ней? Нет. Программа должна вести себя так, словно min() с целыми параметрами определена только один раз. Где и когда в действительности конкретизируется шаблон функции, оставляется на усмотрение разработчика компилятора. Нам достаточно знать, что где-то в программе нужная функция min() была конкретизирована. (Как мы покажем далее, с помощью явного объявления конкретизации можно указать, где и когда оно должно быть выполнено. Такие объявления желательно использовать на поздних стадиях разработки продукта для улучшения производительности.)
Решение включать определения шаблонов функций в заголовочные файлы не всегда удачно. Тело шаблона описывает детали реализации, которые пользователям не интересны или которые мы хотели бы от них скрыть. В действительности, если определение шаблона велико, то количество кода в заголовочном файле может превысить разумные пределы. Кроме того, многократная компиляция одного и того же определения при обработке разных файлов увеличивает общее время компиляции программы. Отделить объявления шаблонов функций от их определений позволяет модель компиляции с разделением. Посмотрим, как ее можно использовать
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
3.8.1. Подготовка к компиляции
3.8.1. Подготовка к компиляции Прежде чем выполнять какие-то действия по обновлению ядра, нужно подготовиться к самому худшему, а именно — к краху системы. Да, неправильные действия в самом деле могут нарушить работу или сделать невозможной загрузку системы. Ядро — это
Проблемы, возникающие при компиляции ядра
Проблемы, возникающие при компиляции ядра Если вы корректно установили опции, компиляция ядра, как правило, проходит без проблем, но в некоторых случаях возникают ошибки. Проблемы, встречающиеся при компиляции ядра, описаны ниже.• Ошибки в исходном коде или
17.4. О компиляции нового ядра
17.4. О компиляции нового ядра 17.4.1 Зачем вообще нужно компилировать ядро? Как было сказано в начале данного раздела, основная функция ядра состоит в том, чтобы обеспечить взаимодействие с аппаратурой компьютера. Обслуживание некоторых составляющих аппаратного
17.4.2 Что надо знать до начала компиляции
17.4.2 Что надо знать до начала компиляции Пожалуй, самое первое, к чему нужно быть готовым, приступая к компиляции ядра, - это то, что процедура эта длительная. Так что не рассчитывайте скомпилировать ядро "между делом", в свободную минутку. Заранее планируйте, что потратите
Распространенные проблемы компиляции Asterisk
Распространенные проблемы компиляции Asterisk Существует множество проблем компиляции, с которыми часто сталкиваются пользователи. Далее рассматриваются некоторые самые распространенные из них и способы их решения.Сначала давайте рассмотрим некоторые ошибки, которые
Ошибки depmod во время компиляции
Ошибки depmod во время компиляции Если во время компиляции возникают ошибки depmod, вероятнее всего, отсутствует символическая ссылка на исходные файлы ядра Linux. Если исходные файлы используемого ядра Linux не установлены, необходимо скачать их в Интернете c сайта http://kernel.org,
Правило 31: Уменьшайте зависимости файлов при компиляции
Правило 31: Уменьшайте зависимости файлов при компиляции Рассмотрим самую обыкновенную ситуацию. Вы открываете свою программу на C++ и вносите незначительные изменения в реализацию класса. Заметьте, не в интерфейс класса, а просто в реализацию – только в закрытые члены.
Цикл компиляции страницы ASP.NET 2.0
Цикл компиляции страницы ASP.NET 2.0 Независимо от того, какую модель страницы вы использовали (одномодульную страницу или страницу с внешним кодом поддержки), ваши файлы *.aspx (как и любые связанные файлы с кодом поддержки) динамически компилируются в действительный
Цикл компиляции одномодульных страниц
Цикл компиляции одномодульных страниц При использовании модели одномодульной страницы, HTML-разметка, блоки ‹script› и определения Web-элементов управления динамически компилируются в тип класса, производный от System.Web.UI.Page.Имя этого класса получается из имени файла *.aspx с
Цикл компиляции многомодульных страниц
Цикл компиляции многомодульных страниц Процесс компиляции страницы, построенной по модели с внешним кодом поддержки, подобен процессу компиляции одномодульной страницы. Однако получающийся при этом тип, производный от System.Web.UI.Page, компонуется из трех файлов (да, именно
1.4.1. Компиляция с включением отладочной информации
1.4.1. Компиляция с включением отладочной информации Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция -g компилятора. Если имеется описанный выше файл Makefile, достаточно
10.5. Модели компиляции шаблонов А
10.5. Модели компиляции шаблонов А Шаблон функции задает алгоритм для построения определений множества экземпляров функций. Сам шаблон не определяет никакой функции. Например, когда компилятор видит шаблон:template typename TypeType min( Type t1, Type t2 ){return t1 t2 ? t1 : t2;}он сохраняет
10.5.1. Модель компиляции с включением
10.5.1. Модель компиляции с включением Согласно этой модели мы включаем определение шаблона в каждый файл, где этот шаблон конкретизируется. Обычно оно помещается в заголовочный файл, как и для встроенных функций. Именно такой моделью мы пользуемся в нашей книге.
10.5.2. Модель компиляции с разделением
10.5.2. Модель компиляции с разделением Согласно этой модели объявления шаблонов функций помещаются в заголовочный файл, а определения – в файл с исходным текстом программы, т.е. объявления и определения шаблонов организованы так же, как в случае с невстроенными (non-inline)
16.8. Шаблоны классов и модель компиляции A
16.8. Шаблоны классов и модель компиляции A Определение шаблона класса - это лишь предписание для построения бесконечного множества типов классов. Сам по себе шаблон не определяет никакого класса. Например, когда компилятор видит:template class Typeclass Queue { ... };он только сохраняет
16.8.2. Модель компиляции с разделением
16.8.2. Модель компиляции с разделением В этой модели определение шаблона класса и определения встроенных функций-членов помещаются в заголовочный файл, а определения невстроенных функций-членов и статических данных-членов - в файл с исходным текстом программы. Иными