Шаблоны функций - Явная специализация VS Глобальные функции (C ++)

StackOverflow https://stackoverflow.com/questions/3888058

Вопрос

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

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

Но тогда вместо Явная специализация Мы также могли бы просто код Функция nontemplate который можно назвать от main Отказ Это сэкономит нам некоторое время обработки, так как компилятор будет обнаружен Функции nontemplate быстрее, чем Явные специализированные шаблонные функции который бы в свою очередь будет лучше с точки зрения эффективности.

Так почему мы используем Явная специализация Когда у нас есть альтернатива просто призванию Функции nontemplate?

Пожалуйста, поправьте меня, если я ошибаюсь!

Редактировать 1:Мне сказали, что мой профессор, когда мы делаем шаблоны функций и вызвать функцию из main Компилятор сначала ищет функцию с шаблонной стержней, и если она не может найти, что он ищет поиск шаблона функции, из которого он в свою очередь, делает шаблон с шаблоном, а затем вызывает его.

Это было полезно?

Решение

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

Явная специализация используется, когда у вас есть особый случай, который может извлечь выгоду из особого лечения. Иногда эта ошибка, как в случае std::vector<bool>, в то время как в других случаях это довольно удобно. Это означает, что пользователь функции не должен знать, что есть особый случай; Это просто прозрачно.

Другие советы

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

Почему компилятор находит функцию nontemplate быстрее, чем специализация шаблона функции? Вы сравнивали производительность компилятора, чтобы проверить это утверждение? Если вы используете функцию с именем f, Компилятор всегда должен компилировать набор функций-кандидатов и выполнять разрешение перегрузки, чтобы определить правильную функцию для использования.

Во время выполнения (которая заключается в том, когда производительность действительно имеет значение, верно?) Производительность вызова функциональной структуры шаблона должна быть не лучше, чем производительность вызова функции nontemplate.

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

В общем случае, для шаблонов функций, вы не используете явную специализацию, потому что это обычно запутается и сложно. Стандарт ISO C ++ имеет поэтическое предупреждение, чтобы быть крайне осторожным при специализации шаблонов функций. Вы можете прочитать травяную саттер «Почему бы не специализировать шаблоны функций?» Для хорошего объяснения вопросов и почему вы не хотите специализироваться на шаблонах функций.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top