exponenta event banner

Количество вызываемых функций

Количество отдельных функций, вызываемых в теле функции

Описание

Эта метрика определяет количество отдельных функций, которые вызываются функцией в ее теле.

Вызовы через указатель функции не учитываются. Подсчитываются вызовы в недостижимом коде и вызовы стандартных библиотечных функций. assert рассматривается как макрос, а не как функция, поэтому не считается.

При вычислении этой метрики в коде C++ Polyspace ® игнорирует неявные функции, создаваемые компилятором, такие как конструкторы по умолчанию и деструкторы. Определяемые пользователем конструкторы и деструкторы учитываются как вызовы функций. В иерархии классов, если базовый класс имеет определяемые пользователем конструкторы, Polyspace подсчитывает соответствующие конструкторы производных классов в качестве функций.

Рекомендуемый верхний предел для этой метрики равен 7. Для получения дополнительного автономного кода попробуйте установить верхний предел для этой метрики.

Сведения о наложении ограничений на метрики см. в разделе Метрики сложности вычислительного кода.

Примеры

развернуть все

int func1(void);
int func2(void);

int foo() {
    return (func1() + func1()*func1() + 2*func2());
}

В этом примере количество вызываемых функций в foo равно 2. Вызываемые функции: func1 и func2.

#include <stdio.h>
int fibonacci(int);

void main() {
 int count;
 printf("How many numbers ?");
 scanf("%d",&count);
 fibonacci(count);
}

int fibonacci(int num)
{
   if ( num == 0 )
      return 0;
   else if ( num == 1 )
      return 1;
   else
      return ( fibonacci(num-1) + fibonacci(num-2) );
} 

В этом примере количество вызываемых функций в fibonacci равно 1. Вызываемая функция: fibonacci сам.

            #include<iostream>
class A{
    public:
	A(){
		std::cout<<"Create A\n";
	}
	~A() = default;
	A(const A&)=default;
	A(A&&) = default;
	virtual void bar(){ std::cout<<"A";}
};
class B: public A{
    public:
	B() = default;
	 void bar() override {std::cout<<"B";}
};

void func(A& a){
	a.bar();
}

int main(){
	A obj;
	A obj2 = obj;
	B objB;
	func(obj);
	return 0;
}

В этом примере количество вызываемых функций в main три:

  1. Конструктор класса A. Этот определяемый пользователем конструктор считается вызовом функции.

  2. Конструктор класса B. Поскольку конструктор базового класса A определяется пользователем, конструктор B подсчитывает как вызов функции, даже если B::B() объявлен как =default.

  3. Функция func.

Класс A использует конструктор копирования по умолчанию или неявный конструктор копирования. Вызов конструктора копирования в A obj2 = obj; не считается вызовом функции.

Метрическая информация

Группа: Функция
Акроним: CALLS
ЕГО метрика: Да