通过代码来减少这个函数的权重
Reducing the weight of this Function by means of Code
考虑以下函数
- 添加需要4个操作
- 分配成本1操作
- 成本比较1操作
计算上述函数需要14次操作
int function1(int a,int b,int c, int d, int e)
{
int returnNumber;
//int no = randomNumber(); //Some Random Number Generator Function , Lets Assume the cost of this function to be 0 for simplicity purpose
switch(randomNumber())
{
case 0: returnNumber = a+b; // costs 6 Operations , Case Check costs 1, assignment costs 1 and addition costs 4
break;
case 1: returnNumber = c+d; // Costs 6 Operations
break;
default: returnNumber = e; // costs 2 Operations
}
return returnNumber;
}
这个函数的总成本是14次操作,是否有代码可以做同样的事情,并将这个函数的成本至少减少1 ?
编辑1 增加了Switch语句中的Break语句,以及将变量no赋值给randomNumber生成器函数
编辑2我从我的一个朋友那里遇到了这个问题,他碰巧在f2f中遇到了这个问题,我想知道这个问题是否有解决方案,因为我到现在还没有找到任何解决方案
正如最初编写的那样,switch
块没有break
语句,因此返回值始终是最后一个情况的结果,而不管生成的随机数是什么。因此,整个函数可以简化为:
int function1(int a,int b,int c, int d, int e)
{
return e;
}
当前版本可以调整为:
int function1(int a,int b,int c, int d, int e)
{
switch(randomNumber())
{
case 0: return a+b;
case 1: return c+d;
default: return e;
}
}
,根据您的度量将导致每个情况下少一个变量赋值。(然而,任何像样的编译器都会将其优化掉。)
您可以通过不分配no来减少1个操作,并直接在您的开关中使用randomNumber()的返回值,并且您在开关的情况下忘记了中断,除非它是故意的。
switch(randomNumber())
{
case 0: returnNumber = a+b;break;
case 1: returnNumber = c+d;break;
default: returnNumber = e;
}
如果不查看生成的实际代码,就无法评估这些操作的成本。而代码的生成取决于目标、编译器和编译选项的选择等诸多因素。优化编译器可以重新组织代码以提高效率或减少代码大小,在语句级别进行微优化,例如这里所要求的是一个没有意义的点。
此外,函数调用的成本和switch
调度的成本可能会使单个操作的极小时间相形见绌。
将结果存储在局部变量中或直接返回它对于现代优化编译器来说应该没有什么区别,这主要是编码约定的问题。
如果本地编码约定指定应该有单个return
语句,则使用:
// the prototype for randomNumber should come from a header file
int randomNumber(void); //Some Random Number Generator Function
int function1(int a, int b, int c, int d, int e) {
int returnNumber;
switch (randomNumber()) {
case 0:
returnNumber = a + b;
break;
case 1:
returnNumber = c + d;
break;
default:
returnNumber = e;
break;
}
return returnNumber;
}
如果您可以有多个return
语句,请使用更简单的版本:
int function1(int a, int b, int c, int d, int e) {
switch (randomNumber()) {
case 0:
return a + b;
case 1:
return c + d;
default:
return e;
}
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- void函数来计算所指向的节点的权重
- 通过代码来减少这个函数的权重