Что произойдет, если я реализую класс в заголовочном файле?

Возможный дубликат:
Встроенные функции в C ++

Что делает компилятор, если я полностью реализую класс в его заголовочном файле? Типичный пример:

class MyException
{
public:
explicit MyException(const char* file, int line) file(file), line(line) {};
const char* getFile() const { return file };
int getLine() const { return line };
private:
const char* const file;
const int line;
};

Мое намерение состоит в том, чтобы использовать класс следующим образом: throw MyException(__FILE__, __LINE__),

Я включаю этот заголовочный файл в каждый файл .cpp. Я предполагаю, что компилятор будет компилировать класс столько раз, сколько он определен, и включать (идентичный) машинный код в каждый создаваемый объектный файл. Теперь, что будет делать компоновщик? Я попробовал более простой пример (без всех этих надоедливых constх) и скомпилировано нормально.

Что бы произошло, если бы вместо простого класса я реализовал функцию C длиной в три экрана в заголовочном файле? И последний вопрос, должен ли я разделить мой пример на файлы .h и .cpp?

5

Решение

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

Это функции-члены класса, которые генерируют код. Когда вы определяете функцию-член внутри определения класса, она дает функции неявный inline декларация.

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

(1) Одна копия функционального кода с инструкцией по сборке RETURN в конце может быть размещена на изображении, а инструкция по сборке CALL (вместе с передачей параметров и передачей возвращаемого значения) может быть размещена на месте вызова для передачи управления к этому коду.

или же

(2) Полная копия реализации функции может заменить весь вызов функции на сайте вызова.

Функция объявлена inline это рекомендация компилятору сделать это вторым способом. Далее inline Объявление позволяет определить функцию в нескольких единицах перевода (чтобы ее можно было поместить в общий заголовочный файл). Чтобы у компилятора была возможность реализовать второй метод, ему требуется копия реализации функции во время компиляции. Это недоступно, если реализация функции находится в иностранном модуле перевода.

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

http://gcc.gnu.org/onlinedocs/gcc/Inline.html

3

Другие решения

Все методы будут встроенными методами. Вы можете потерять некоторое минимальное время на общую компиляцию, но это нормально. Насколько я знаю, знаю, что единственная проблема, которая может возникнуть, — это если у вас есть статическая переменная, не являющаяся членом. Затем вы должны назначить место для хранения (поместите определение и начальное значение, если хотите), вероятно, в .cpp или иначе вы получите ошибки компоновщика о множественном определении.

Я видел только проекты заголовков, которые имели только main() функционировать в CPP, но это было сильно шаблонно.

3

Когда вы реализуете функции-члены внутри заголовочного файла, все эти функции становятся неявно inline,

Что это значит и какие последствия это имеет?

Согласно,
Стандарт C ++ 03 §7.1.3 / 4:

  • Он указывает компилятору, что замена тела функции в точке вызова предпочтительнее обычного механизма вызова функции.
  • Даже если внутренняя подстановка опущена, другие правила (особенно w.r.t One Definition Rule) для inline соблюдаются.

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

Обычно любой хороший основной компилятор заменяет тело функции в точке вызова, если это необходимо, поэтому маркировка функций inline просто для № 1 не очень хорошая идея, но если вы хотите сделать свой намерение понятно для пользователей вашего класса, тогда вы можете сделать это, определив функции в заголовке или явно пометив свои функции как inline,

Должен ли я разделить мой пример на .h а также .cpp файлы?

Да, это обычная модель компиляции, которую использует большинство проектов, в которой вы отделяете интерфейс (.h) от реализации (.cpp). Интерфейсы совместно используются с пользователями вашего кода в виде заголовочных файлов, в то время как реализация предоставляется в виде двоичных файлов. немного в той степени, в которой это обеспечивает защиту вашей интеллектуальной собственности.
Это известно как Модель разделения.

Проекты C ++, использующие шаблоны, обычно используют Модель включения а не модель разделения обычных проектов C ++.

3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector