编码风格:根据某些标志编写函数调用的最佳方式

Coding Style: Best way to program function calls dependent on some flag

这是一道简单的C题。我这样设计我的代码:

main()
{
   ...
   do_my_func1();
   ...
}

do_my_func1() 这样做的地方:

void do_my_func1()
{
   if (flag)
   {
      ..do the processing for this function
   }
}

我的老板说这实际上应该这样做:

main()
{
   ...
   if (flag)
   {
      do_my_func1();
   }
   ...
}

void do_my_func1()
{
   ..do the processing for this function
}

那么进行这样的函数调用的最佳做法是什么 - 我认为我的方法是最好的方法,尤其是当您调用许多函数时依赖于许多标志?

除非你有很好的理由,否则你绝对应该选择老板给你的选项。一种选择是:

void do_my_func1(int flag)
{
   if (flag)
   {
      ..do the processing for this function
   }
}

什么是最好的要视情况而定,不能用这样一个笼统的例子来确定。

尽可能避免使用全局变量。在某些情况下它们很好,但懒惰不是其中之一。 ;)

如果flag非常多,就打包成数组或者struct。

像您的 do_my_func1() 这样的函数应该始终坚持做简单的事情,并且应该事先完成调用它的检查,所以 if (flag) 应该总是在父函数中。

另外一个好的做法是在同一个文件中调用的函数前面添加static,这样可以减轻编译后的可执行文件

在这种情况下老板是对的。 在您的代码中总会有一个函数调用。如果未设置标志,这是无用的。 检查条件比调用函数花费的时间少得多。调用函数需要大量处理。 (link) 评估条件要容易得多。 在现代编译器中,分支预测更加准确,并且通过消除函数调用节省了大量时间。 您可以制作一个小演示来验证这一点: `

main()
{
   int n=INTMAX;
   int m=INTMAX;
   struct timeval start, stop;
   double msecs = 0;

   gettimeofday(&start, NULL);
   for(;n>0;n--){
       for(;m>0;m--){  
           if (flag)
           {
              do_my_func1();
           }
           ...
        }
    }
   gettimeofday(&stop, NULL);
   msecs = (double)(stop.tv_usec - start.tv_usec) / 1000.0f + (double)(stop.tv_sec - start.tv_sec)*1000.0f ;
   printf("time taken %f\n",msecs);
}

void do_my_func1()
{
   ..do the processing for this function
}`

v/s你的版本和记录时间。