Скажем, у меня есть следующая метафункция:
template <typename T>
struct make_pair {
using type = std::pair<
typename std::remove_reference<T>::type,
typename std::remove_reference<T>::type
>;
};
Может ли это улучшить скорость компиляции (или что-то еще)?
template <typename T>
struct make_pair {
using without_reference = typename std::remove_reference<T>::type;
using type = std::pair<without_reference, without_reference>;
};
Я вижу две возможности:
-
Компилятор должен выполнять некоторую работу каждый раз, когда видит
typename std::remove_reference<T>::type
. Использование промежуточного псевдонима имеет какое-то "кэширование" поведения, которое позволяет компилятору выполнять некоторую работу только один раз. -
Производительность времени компиляции измеряется с точки зрения количества экземпляров шаблонов, которые должен выполнить компилятор. Поскольку
std::remove_reference<T>::type
относится к тому же типу, что иstd::remove_reference<T>::type
, в обоих случаях требуется только один экземпляр шаблона, поэтому обе реализации эквивалентны производительности времени компиляции WRT.
Я думаю, что B прав, но я хотел бы быть уверен. Если ответ окажется специфичным для компилятора, мне бы в основном было интересно узнать ответ для Clang и GCC.
Edit
Я сравнивал компиляцию тестовой программы с некоторыми данными для работы. Программа тестирования делает что-то вроде этого:
template <typename ...> struct result;
template <typename T>
struct with_cache {
using without_reference = typename std::remove_reference<T>::type;
using type = result<without_reference, ..., without_reference>;
};
template <typename T>
struct without_cache {
using type = result<
typename std::remove_reference<T>::type,
...,
typename std::remove_reference<T>::type
>;
{ };
using Result = with[out]_cache<int>::type;
Это среднее время для 10 компиляций программы, с 10 000 параметров шаблона в result<>
.
-------------------------
| g++ 4.8 | clang++ 3.2 |
-----------------------------------------
| with cache | 0.1628s | 0.3036s |
-----------------------------------------
| without cache | 0.1573s | 0.3785s |
-----------------------------------------
Программа тестирования генерируется script здесь.