exponenta event banner

Более высокая оценка размера локальной переменной

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

Описание

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

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

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

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

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

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

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

  • Компилятор выполняет анализ переменной жизнедеятельности для оптимизации памяти. Например, компиляторы сохраняют адрес, на который возвращается выполнение после вызова функции. При вычислении этой метрики 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, более высокая оценка размера локальной переменной для funcсоставляет 28. Разбивка размера показана в этой таблице.

ПеременнаяРазмер (в байтах) Общая сумма выполнения
Возвращаемое значение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