有关提高此代码可读性的建议

时间:2015-03-03 15:57:56

标签: c code-readability

我不确定是否应该在此处或其他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;
        }
    }
}

但我仍然觉得可能有更好的方法,需要你的投入。 (如果不在这里主题,请迁移)

5 个答案:

答案 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似乎不是很聪明)。

请注意,传递普通intunsigned intsize_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);
    }
}