У меня есть вопрос по шаблонам и компоновщику - PullRequest
0 голосов
/ 03 ноября 2019

У меня возник вопрос при изучении шаблона

  1. Шаблоны не создают экземпляр кода, если они еще не использовались, поэтому компилятор не будет реализовывать шаблон в файле obj икомпоновщик не найдет соответствующее содержимое в файле obj.

  2. Компиляция занимает больше времени, поскольку большая часть кода создается во время компиляции.

IЯ думаю, что эти две формулировки не работают вместе, поэтому я пришел к выводу, что связывание происходит до создания экземпляра шаблона во время компиляции. Что ты думаешь?

1 Ответ

0 голосов
/ 04 ноября 2019

1. Шаблоны не создают экземпляр кода, если они еще не использовались, поэтому компилятор не будет реализовывать шаблон в файле obj, а компоновщик не найдет соответствующее содержимое в файле obj.

Шаблоны - это, в основном, чертежи того, как генерировать класс во время компиляции. Таким образом, компилятор может смотреть на шаблон и генерировать на его основе класс во время компиляции. Тем не менее, это говорит о том, что компилятор не беспокоится о генерации определенного класса из шаблона, пока не узнает, что вам нужно его использовать.

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

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

Я думаю, что эти две формулировки не работают вместе...

Не уверен, что здесь кажется противоречивым. 2 говорит, что компилятор делает тяжелую работу для создания определенного шаблонного класса. 1 говорит, что это не мешает делать это, если в этом нет необходимости. И то, и другое может быть правдой.

... поэтому я пришел к выводу, что связывание происходит до создания экземпляра шаблона во время компиляции. Что вы думаете?

Нет. Не может случитьсяКомпиляция всегда происходит перед линковкой. Хотелось бы, чтобы у меня было более глубокое объяснение, но это вроде как. Это просто не то, как работает C ++.

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

...