Поиск…


Вступление

При компиляции компилятор часто изменяет программу для повышения производительности. Это разрешено по правилу as-if , которое допускает любые и все преобразования, которые не изменяют наблюдаемое поведение.

Встроенное расширение / встраивание

Встроенное расширение (также известное как inlining) - это оптимизация компилятора, которая заменяет вызов функции с телом этой функции. Это экономит служебные данные вызова функции, но ценой пространства, так как функция может дублироваться несколько раз.

// source:

int process(int value)
{
    return 2 * value;
}

int foo(int a)
{
    return process(a);
}

// program, after inlining:

int foo(int a)
{
    return 2 * a; // the body of process() is copied into foo()
}

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

Пустая оптимизация базы

Размер любого объекта или субобъекта участника должен быть не менее 1, даже если тип представляет собой пустой тип class (то есть class или struct , у которых нет нестатических членов данных), чтобы иметь возможность гарантировать, что адреса отдельных объектов одного и того же типа всегда различны.

Однако подобъекты базового class не так ограничены и могут быть полностью оптимизированы из макета объекта:

#include <cassert>

struct Base {}; // empty class

struct Derived1 : Base {
    int i;
};

int main() {
    // the size of any object of empty class type is at least 1
    assert(sizeof(Base) == 1);

    // empty base optimization applies
    assert(sizeof(Derived1) == sizeof(int));
}

Пустая оптимизация базы обычно используется стандартными библиотечными классами, поддерживающими распределители ( std::vector , std::function , std::shared_ptr и т. Д.), Чтобы избежать использования какого-либо дополнительного хранилища для его элемента-распределителя, если распределитель не имеет состояния. Это достигается за счет хранения одного из требуемых элементов данных (например, указателя begin , end или capacity для vector ).

Ссылка: cppreference



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow