gpt4 book ai didi

C++模板制作具有不同常量的多个版本的函数

转载 作者:行者123 更新时间:2023-11-30 00:59:37 26 4
gpt4 key购买 nike

我可以使用模板创建一些函数的多个实例化,仅在某些常量参数上有所不同吗?此参数的备选方案数量是固定的。例如。

我不想重写(上面是 1..32 的 2 次幂)

funct(param, int upper)
{
some_loops(..)
some_heavy_code_fast_for_const_and_slow_for_variable(upper)
}

成一组​​

funct_with_upper_is_1(param) // upper =1
{ manually_copied_code...heavy(1) }
funct_with_upper_is_2(param) // upper =2
{ manually_copied_code...heavy(2) }
funct_with_upper_is_4(param) // upper =4
{ manually_copied_code...heavy(4) }
funct_with_upper_is_8(param) // upper =8
{ manually_copied_code...heavy(8) }

但进入模板化

template<int upper>
funct_with_fixed_upper(param)
{ the_original_code....heavy(upper) }

然后

template<upper=1> funct_with_fixed_upper(param);
template<upper=2> funct_with_fixed_upper(param);
template<upper=4> funct_with_fixed_upper(param);
template<upper=8> funct_with_fixed_upper(param);

这对 C++ 模板来说可能吗?

== 开启详细模式 ==

我有很多包含这样代码的 C++ 文件

function_typical(long long double ***A, long long double ***B, int const_1, int const_2)
// the type "long long double" here is very correct, this is extension of compiler
{

for(int i=1;i<100000-1;i++)
for(int j=1;j<100000-1;j++)
for(int k=0;k<const_1;k++)
for(int l=k;l<const_2;l++) {
// some cray work with array like
A[i][j][l-k]+=(B[i][j][l-k]+A[i+1][j][l-k]+A[i][j+1][l-k]-A[i-1][j][k]-A[i][j-1][l-k]/2.2)/88.3;
if(A[i][j][l-k]>sin_lld(A[i][j-1][l-k])){B[i][j][l-k]=A[i][j][k]*4;}
}
}

这只是一个例子,但是:

  • 我不能互换循环;
  • 2个外部循环,i和j有很多次迭代
  • 2 个内部(嵌套)k 和 l 有一些迭代,其中的数量被传递到 function_typical 并且它们的集合是固定的,例如const_1 和 const_2 是一对:(2,3)、(4,5)、(3,5)。允许的对总数小于 10。

这段代码的问题是它的速度很慢。如果我将此代码中的 const_1 和 const_2 固定为数字常量,编译器将在优化方面做得很好(例如展开所有 k 和所有 l 迭代,做一些聪明的工作)。

但我实际上无法更改每组(const_1 和 const_2)对的每个类似典型的函数。此外,编译器的常量传播器不能传播集合信息函数的常量(这是一个网络服务器,客户端从固定集合中选择一些 const_1 和 const_2 对)。

所以我在编译时知道所有对的选择。但是我没有机会手动重写每个函数。

== 详细模式关闭 ==

提前致谢

最佳答案

当然,这是完全可能的。如果您通过模板获取一个 int,那么只要常量表达式有效,它就有效。

template<int const_1, int const_2> function_typical(long long double ***A, long long double ***B)
// the type "long long double" here is very correct, this is extension of compiler
{

for(int i=1;i<100000-1;i++)
for(int j=1;j<100000-1;j++)
for(int k=0;k<const_1;k++)
for(int l=k;l<const_2;l++) {
// some cray work with array like
A[i][j][l-k]+=(B[i][j][l-k]+A[i+1][j][l-k]+A[i][j+1][l-k]-A[i-1][j][k]-A[i][j-1][l-k]/2.2)/88.3;
if(A[i][j][l-k]>sin_lld(A[i][j][l-k])){B[i][j][l-k]=A[i][j][k]*4;}
}
}

这应该直接重新编译,但您必须更改调用站点。另外,不要忘记模板代码必须在所有翻译单元中都有完整的源代码,不能只在一个翻译单元中定义。

关于C++模板制作具有不同常量的多个版本的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038030/

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