gpt4 book ai didi

c++ - 可怕的元函数 : why are they faster?

转载 作者:行者123 更新时间:2023-11-27 23:40:27 26 4
gpt4 key购买 nike

我观看了演讲并阅读了博客文章,但我仍然不确定...这是为什么

template<bool B> struct conditional { template<class T, class F> using f = T; };

template<> struct conditional<false> { template<class T, class F> using f = F; };

template<bool B, class T, class F> using conditional_t = typename conditional<B>::template f<T, F>;

编译速度比

template<bool B, class T, class F> struct conditional { using type = T; };

template<class T, class F> struct conditional<false, T, F> { using type = F; };

template<bool B, class T, class F> using conditional_t = typename conditional<B, T, F>::type;

?

第一个版本需要实例化一个带有一个参数的模板类和一个带有两个的模板别名,第二个版本需要实例化一个带有三个参数的模板类和一个带有零的模板别名...好吧,模板别名有点便宜, 但它有这么大的不同吗?

最佳答案

首先,我认为有一点不同:

template<bool B, class T, class F> struct conditional;

template<class T, class F> struct conditional<false, T, F>;

此处的编译器必须将所有 3 个参数与 false, T, F 进行模式匹配.这很容易,但不是免费的。

template<bool B> struct conditional;
template<> struct conditional<false>;

这里它必须对 false 的一个参数进行模式匹配.

所以选择专业更容易。

接下来是生成类型的长度;我发现长类型名称导致编译器内存使用变得令人讨厌。 conditional<b, T, F>在非 SCARY 情况下是实际唯一且不同类型的名称。它的长度是参数长度的 O(n)。

在 SCARY 情况下,不会创建新的 O(n) 类型。

typename conditional<false>::template f<T, F>;

这只是 F 的另一个名称.类型conditional<false>已创建,其中有一个别名模板,并且该别名模板不创建新类型。返回类型是 F ,如果您尝试将其与 template<class,class>class Z, class A, class B, Z<A,B> 进行匹配它不匹配。

最后也是最重要的,内存。每次调用 SCARY 条件都会创建 conditional<false>conditional<true> .所以第 500 次,它可以进行零模板特化检查并只获取预先计算的类型。

从该预计算类型中,我们得到 template type<T,F>别名;我们在没有内存的情况下应用它来获得 TF .

在非 SCARY 中,每个不同的 TF表示不同的 conditional<b,T,F>类型。因此,更大的内存缓存、更少的命中和未命中,您需要运行完整的模板特化检查以确保没有人去

template<class U> conditional<true, int, U>{using type=U;};

并针对您正在使用的特定类型覆盖它。

关于c++ - 可怕的元函数 : why are they faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55505316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com