Шаблоны функций - явная специализация против глобальных функций (C ++) - PullRequest
2 голосов
/ 08 октября 2010

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 08 октября 2010

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

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

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

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

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

1 голос
/ 09 октября 2010

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

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

1 голос
/ 08 октября 2010

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

...