我不确定是否应该在此处或其他StackExchange网站上询问此问题,但我会继续...如果此处不合适请迁移...
我正在审核代码。要求是调用函数n
次,参数范围从0到n
。但如果n
大于7,则只调用该函数7次。
我的同事实施如下:
void ExecuteFunctions(U8 count)
{
if(count > 0) oprA(0);
if(count > 1) oprA(1);
if(count > 2) oprA(2);
if(count > 3) oprA(3);
if(count > 4) oprA(4);
if(count > 5) oprA(5);
if(count > 6) oprA(6);
if(count > 7) oprA(7);
}
我将其修改为:
void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < count; loopcnt++)
{
oprA(loopcnt);
if(loopcnt == 7)
{
// We don't want to execute this function more number of times if it is already executed 7 times
break;
}
}
}
但我仍然觉得可能有更好的方法,需要你的投入。 (如果不在这里主题,请迁移)
答案 0 :(得分:2)
MIN是一个有用且经常定义的宏
#define MIN(a,b) (((a) > (b)) ? (b) : (a))
#define MAX_STEP 7
void ExecuteFunctions(U8 count)
{
int loopcnt = 0;
count = MIN(count, MAX_STEP);
while(loopcnt++ < count) {
oprA(loopcnt);
}
}
答案 1 :(得分:2)
让编译器优化它。我觉得以下内容更具可读性:
void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < count && loopcnt < 8; loopcnt++)
{
oprA(loopcnt);
}
}
当然,您需要运行一个分析器来实际评估您的程序的性能。
答案 2 :(得分:1)
我会把它写成
void ExecuteFunctions(unsigned count) {
// Could use min() too if available.
unsigned iters = count < 7 ? count : 7;
for (unsigned i = 0; i < iters; ++i)
oprA(i);
}
在X86_64上使用GCC 4.9和-O3
为此函数生成的代码大小约为36个字节。原始版本的大小为141字节(GCC似乎不是很聪明)。
请注意,传递普通int
,unsigned int
,size_t
等等,通常比缩小参数更好,因为您知道该值很小。编译器通常可以更轻松地为具有自然大小的变量生成良好的代码。例外情况是您需要存储大量数据。
<强>更新强>
以下版本(从奥斯汀的答案中修改了一点 - 抱歉偷了它:))顺便提一下32字节。我想我更喜欢它。
void ExecuteFunctions(unsigned count) {
for (unsigned i = 0; i < count && i < 8; ++i)
oprA(i);
}
答案 3 :(得分:0)
void ExecuteFunctions(U8 count)
{
for(U8 loopcnt = 0; loopcnt < (count & 7); loopcnt++)
{
oprA(loopcnt);
}
}
答案 4 :(得分:0)
如果您真的喜欢switch
语句,请尝试以下操作,看看它是否能够在代码审核中幸存下来:
void ExecuteFunctions(U8 count) {
int i = 0;
switch (count) {
default: oprA(i++);
case 6: oprA(i++);
case 5: oprA(i++);
case 4: oprA(i++);
case 3: oprA(i++);
case 2: oprA(i++);
case 1: oprA(i++);
case 0: oprA(i);
}
}