主要内容

指令数

每个函数的指令数目

描述

此度量会测量函数体中的指令数目。

此度量的建议上限为 50。要获得更模块化的代码,请尝试为此度量强制应用一个上限。

要对度量强制应用某些限制,请参阅使用 Polyspace 计算代码复杂度度量

计算详细信息

此度量是按照以下规则计算的:

  • 以分号 (;) 结尾的简单语句就是一条指令。如果语句为空,则不会将其视为指令。

  • 如果以下任一条件为 true,则将变量声明视为一条指令:

    • 变量为非静态且已初始化。例如:

      int var = 0;
      静态变量的声明不被视为语句。在 C++ 中,它们可能在编译时初始化。

    • 变量是通过函数调用(例如构造函数)初始化的。例如:

      class A {
      public:
      	A();
      	A(int in) {
      		/*..*/
      	}
      };
      //...
      A obj(5); //Calls A::A(int). This is considered a single instruction.

  • ifforbreakgotoreturnswitchwhiledo-while 等控制流语句均被视为一条指令。

  • 代码块的开头和结尾的花括号不会被视为指令。以下块被视为一条指令:

    {
        int var = 1;
    }

  • 标签自身不会被视为指令。以下代码显示了两条指令。case 标签自身不会被视为指令。

    switch (1) {  // Instruction 1: switch 
        case 0: 
        case 1: 
        case 2: 
        default: 
        break;    // Instruction 2: break 
     } 

不计算编译器在需要时生成的隐式构造函数的指令数。例如,如果将构造函数声明为 =default,则 Polyspace® 不会计算该构造函数的指令数。

示例

全部展开

int func(int *arr, int size) {
	int i, countPos = 0, countNeg = 0, countZero = 0;
	for(i = 0; i < size; i++) {
		if(arr[i] > 0)
			countPos++;
		else
			if(arr[i] == 0)
				countZero++;
			else
				countNeg++;
	}
}

在此示例中,Polyspace 报告 func指令数度量的值为 9。这些指令为:

  • countPos = 0

  • countNeg = 0

  • countZero = 0

  • for(i = 0;i < size; i++) { ... }

  • if(arr[i] >= 0)

  • countPos++

  • else if(arr[i] == 0)

    结尾的 else 可视为 if-else 指令的一部分。

  • countZero++

  • countNeg++

注意

此度量不同于可执行行数度量。例如:

  • for(i = 0;i < size; i++) 有一条指令和一个可执行代码行。

  • 这段代码只有一条指令,但有三个可执行代码行。

    for(i=0;
        i<size;
        i++)

此示例说明 Polyspace 如何计算一个类的指令数。myClass 类包含三个数据成员,其中两个使用非静态数据成员初始化进行初始化。该类的默认构造函数声明为 = default。该类还声明了一个用户定义的非默认构造函数。

#include <cstdint>

class myClass
{
public:
	myClass(uint32_t &a) : num1(a) {}
	myClass() = default;

private:
	uint32_t num1;
	uint32_t num2{};
	uint32_t num3{};

};

构造函数 myClass(uint32_t &a) 使用非静态数据成员初始化对两个数据成员进行初始化。其中每项初始化都被视为一条指令,但初始化程序列表中 num1 的初始化不计算在内。对于此构造函数,指令数为 2。

默认构造函数声明为 = default。如果需要,编译器会生成此默认构造函数。Polyspace 不会计算此类编译器生成的隐式构造函数的指令数。

度量信息

:函数
缩写STMT
HIS 度量:是