C语言 编码风格:根据某个标志对函数调用进行编程的最佳方式



这是一个简单的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
}

那么进行这样的函数调用的最佳实践是什么 - 我认为我的方式是最好的方法,特别是如果你调用许多依赖于许多标志的函数?

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

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

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

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

什么是最好的取决于情况,不能在这样的一般例子中确定。

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

如果有很多标志,请将它们打包到数组或结构中。

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

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 %fn",msecs);
}
void do_my_func1()
{
..do the processing for this function
}`

v/s 您的版本并记录时间。

最新更新