Higher Estimate of Local Variable Size

Общий размер всех локальных переменных в функции

Описание

Эта метрика предоставляет консервативную оценку общего размера локальных переменных в функции. Метрика является суммой следующих размеров в байтах:

  • Размер возвращаемого значения функции

  • Размеры параметров функции

  • Размеры локальных переменных

  • Дополнительное заполнение, введенное для выравнивания памяти

Фактическое использование стека из-за локальных переменных может отличаться от метрического значения.

  • Некоторые переменные хранятся в регистрах вместо в стеке.

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

  • Ваш компилятор использует дополнительную память во время вызова функции. При вычислении этой метрики Polyspace не рассматривает это скрытое использование памяти.

Однако метрика предоставляет разумную оценку использования стека из-за локальных переменных.

Чтобы определить размеры основных типов, программное обеспечение использует ваши спецификации для Target processor type (-target). Метрика также учитывает #pragma pack директивы в вашем коде.

Примеры

расширить все

int flag();


int func(int param) {
  int var_1;
  int var_2;
  if (flag()) {
      int var_3;
      int var_4;
    } else {
      int var_5;
    }
}

В этом примере, принимая 4 байта для int, более высокая оценка размера локальной переменной для func28. Разбивка по размеру показана в этой таблице.

ПеременнаяРазмер (в байтах) Общее выполнение
Возвращаемое значение4 4
Параметрический param48
Локальные переменные var_1 и var_24+4=816
Локальные переменные, определенные в if состояние

(4+4)+4=12

Размер переменных в первой ветви составляет восемь байт. Размер во второй ветви - четыре байта. Сумма двух ветвей составляет 12 байт.

28

Заполнение для выравнивания памяти не введено, потому что все задействованные переменные имеют одинаковый тип.

char func(char param) {
  int var_1;
  char var_2;
  double var_3;
}

В этом примере, принимая один байт для char, четыре байта для int и восемь байтов для double и четыре байта для выравнивания, более высокая оценка локального размера переменной для func 20. Выравниванием обычно является размер слова на вашей платформе. В проекте Polyspace вы задаете выравнивание через целевой процессор. Для получения дополнительной информации см. столбец « Выравнивание» в Target processor type (-target).

Разбивка по размеру показана в этой таблице.

ПеременнаяРазмер (в байтах)Общее выполнение
Возвращаемое значение1 1
Дополнительная набивка, введенная перед param хранится

0

Выравнивание памяти не требуется, поскольку следующая переменная param имеет тот же размер.

1
Параметрический param12
Дополнительная набивка, введенная перед var_1 хранится

2

Память должна быть выровнена с помощью заполнения, поскольку следующая переменная var_1 требуется четыре байта. Устройство хранения данных должно начинаться с адреса памяти, кратного четырем.

4
var_148
Дополнительная набивка, введенная перед var_2 хранится

0

Выравнивание памяти не требуется, поскольку следующая переменная var_2 имеет меньший размер.

8
var_219
Дополнительная набивка, введенная перед var_3 хранится

3

Память должна быть выровнена с помощью заполнения, поскольку следующая переменная var_3 имеет восемь байтов. Устройство хранения данных должно начинаться с адреса памяти, кратного выравниванию, четыре байта.

12
var_3820

Правилами для количества заполнения являются:

  • Если следующая сохраненная переменная имеет тот же или меньший размер, заполнение не требуется.

  • Если следующая переменная имеет больший размер:

    • Если размер переменной совпадает или меньше, чем выравнивание на платформе, количество заполнения должно быть достаточным, чтобы адрес памяти был кратен его размеру.

    • Если размер переменной больше, чем выравнивание на платформе, количество заполнения должно быть достаточным, чтобы адрес памяти был кратен выравниванию.

class MySimpleClass {
  public:
    
    MySimpleClass() {};
    
    MySimpleClass(int) {};
    
    ~MySimpleClass() {};  
};


int main() {
  MySimpleClass c;
  return 0;
}

В этом примере предполагаемые локальные размеры переменных:

  • Функции конструктора MySimpleClass::MySimpleClass(): Четыре байта.

    Размер исходит из this указатель, который является неявным аргументом для конструктора. Размер указателя задается с помощью опции Target processor type (-target).

  • Функции конструктора MySimpleClass::MySimpleClass(int): Восемь байт.

    Размер исходит из this указатель и int аргумент.

  • Деструктор MySimpleClass::~MySimpleClass(): Четыре байта.

    Размер исходит из this указатель.

  • main(): Пять байт.

    Размер исходит из int возвращаемое значение и размер объекта c. Минимальный размер объекта - это выравнивание, заданная с помощью опции Target processor type (-target).

class MyClass {
  public:
    MyClass() {};
    MyClass(int) {};
    ~MyClass() {};
  private:
    int i[10];   
};
void func1(const MyClass& c) {
}


void func2() {
  func1(4);  
}

В этом примере предполагаемый размер локальной переменной для func2 составляет 40 байт. Когда func2 вызывает func1, временный объект класса MyClass создается. Объект имеет десять int переменные с размером четырех байтов.

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

Группа: Функция
Акроним: LOCAL_VARS_MAX
ЕГО Метрика: Нет
Введенный в R2016b