Стиль кодирования: лучший способ запрограммировать вызовы функций в зависимости от флага - PullRequest
2 голосов
/ 30 сентября 2019

Это простой вопрос 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
}

Итак, какова лучшая практика при выполнении вызова функции, подобного этому - я думал, что мой путь был лучшим, особенно если вы вызываете много функций, зависящих от многих флагов?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Функция, подобная вашей do_my_func1(), всегда должна выполнять простые вещи, и проверки для ее вызова должны выполняться заранее, поэтому if (flag) всегда должна быть в родительской функции.

Также хорошая практикаэто добавить static перед функциями, которые вызываются в том же файле, это облегчает скомпилированный исполняемый файл

0 голосов
/ 30 сентября 2019

В этом случае босс прав. В вашем коде всегда будет вызов функции. Что бесполезно, если флаг не установлен. Проверка состояния занимает гораздо меньше времени, чем вызов функции. Вызов функции требует большой обработки. ( ссылка ) Гораздо проще оценить состояние. В современном компиляторе ветвление предсказания является более точным и экономит много времени за счет исключения вызова функции. Вы можете сделать небольшую демонстрацию, чтобы проверить это: `

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 ваша версия и запишите время.

0 голосов
/ 30 сентября 2019

Если у вас нет очень веских причин, вам обязательно следует выбрать вариант, который дал вам ваш босс. Одна альтернатива заключается в следующем:

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

Что лучше всего зависит от ситуации и не может быть определено в общем примере, подобном этому.

Избегайте глобальных переменных, когда можете. В некоторых случаях они хороши, но ленивость не входит в их число. ;)

Если флагов очень много, упакуйте их в массив или структуру.

...