gpt4 book ai didi

c++ - 作为函数说明符的模板参数和编译器优化

转载 作者:太空狗 更新时间:2023-10-29 21:02:33 31 4
gpt4 key购买 nike

我找到了 this非常有用的帖子,我想澄清一些关于编译器优化的事情。假设我们有这个功能(与原始帖子中的相同):

template<int action>
__global__ void kernel()
{
switch(action) {
case 1:
// First code
break;

case 2:
// Second code
break;
}
}

编译器是否会在消除无法访问的代码的意义上进行优化,即使我在编译时使用未知的模板变量调用函数 - 比如创建两个单独的函数?例如:

kernel<argv[1][0]>();

最佳答案

简短的回答:没有。

模板完全在编译时实例化和生成,因此您不能使用 argv 中的值,因为它们在编译时是未知的。

我想知道为什么您不尝试一下并将代码扔给编译器 - 它会告诉您模板参数必须是编译时常量。

更新:由于您在评论中告诉我们这主要不是关于性能,而是关于可读性,所以我建议使用 switch/case:

template <char c> void kernel() {
//...
switch(c) { /* ... */ }
}

switch (argv[1][0]) {
case 'a':
kernel<'a'>();
break;
case 'b':
kernel<'b'>();
break;
//...
}

由于您必须做出决定的值(即 argv[1][0])仅在运行时已知,因此您必须使用运行时决定机制。其中,switch/case 是最快的,特别是如果没有太多不同的 case(但超过两个),尤其是如果 case 之间没有间隙(即'a','b','c',而不是 1、55、2048)。然后编译器可以生成非常快的跳转表。

关于c++ - 作为函数说明符的模板参数和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15138583/

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