C++
оптимизация
Поиск…
Вступление
При компиляции компилятор часто изменяет программу для повышения производительности. Это разрешено по правилу 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