Как понять, что «большинство современных компоновщиков удаляют избыточный код, такой как создание шаблонов». - PullRequest
0 голосов
/ 11 июня 2018

С здесь :

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

  • Что означает избыточные экземпляры шаблонов здесь?
  • Помимо экземпляров шаблона, какие еще коды будут избыточными при link-time?

Я постараюсь ответить на первый вопрос самостоятельно, если что-то не так, пожалуйста, поправьте меня.Кстати, пожалуйста, прости мой плохой английский :-)

1 Ответ

0 голосов
/ 11 июня 2018
  • Что означает избыточные экземпляры шаблона здесь?

Предположим, у нас есть template <typename T> class A {};, который объявлен вa.hpp.У нас есть два способа создания объекта в a.cpp:

1.явное создание экземпляра

  • явное определение экземпляра: template class A <type>;
  • явное объявление создания: extern template class A <type>;

2.неявная реализация

  • Когда код ссылается на шаблон в контексте, который требует полностью определенного типа, или когда полнота типа влияет на код и этот конкретный тип не был явно создан , происходит неявное создание

Когда TU не могут найти определение или объявление явного создания экземпляра, t A<int> a; будетвызвать неявную реализацию.

разница между специализацией и экземпляром


Давайте вернемся к вопросу: Что означают избыточные экземпляры шаблона здесь?

Я разделю его на несколько случаев в рамках одного a.cpp:

Случай 1 ---- неявная реализация

#include "a.h"
A<int> a;

=>

class A<int>
{

};

A<int> a;

Случай 2 ---- неявная реализация

#include "a..h"
A<int> a;
A<int> b;

=>

class A<int> 
{

};

A<int> a;
A<int> b;

Случай 3 ---- Явное определение реализации:

#include "a.h"
template class A<int>;
A<int> a;

=>

#include "a.h"
template class A<int>;
A<int> a;
  • Явное объявление экземпляра в файле заголовка будет вести себя так же, как Case3 ----, экземпляр избыточного шаблона не создается.

  • функция-член имеет другие линейки, посмотрите: https://en.cppreference.com/w/cpp/language/class_template


Вывод:

  • Неявная реализация будет создавать избыточные экземпляры шаблона, в то время как явное определение / объявление не будет.
  • Компоновщик удалит такие избыточные экземпляры шаблона, но он увеличится link-time.

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

...