Skip to content

agaltsevstas/OOP

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

ADL

Argument-dependent lookup - поиск по аргументу, можно не указывать пространство имен к функции, если один из аргументов принадлежит к тому же пространству имен и он уже указан. Компилятор ищет функцию в пространствах имен в типах аргументов.

Alignment

Выравнивание памяти - необходимо для эффективного обращения процессора к данным в памяти. Процессору проще обращаться к данным, когда они последовательно лежат по блокам в 4 байта для 32-битной ОС /8 байт 64-битной ОС, поэтому компилятор подкладывает (padding) неиспользуемые байты для выравнивания к границам блоков памяти по 4/8 байт.

EBO

Empty base optimization - гарантирует размер любого объекта/подъекта должен быть не менее 1 байта, даже если тип является пустым, чтобы можно было получить разные адреса разных объектов одного и того же типа.

POD

Plain old data - простая структура данных (std::is_pod), занимающая непрерывную область памяти, компилятор НЕ оптимизируют поля класса/структуры: они находятся в памяти в том порядке, в котором они указаны (возможно с некоторым выравниванием - aligment), поэтому объекты такого типа можно скопировать с помощью memcpy, сериализировать по сети и воссоздать. Противоположность POD типа — управляемая структура данных, которую компилятор может оптимизировать поля класса/структуры по усмотрению (переставить местами), такая перестановка может серьёзно сэкономить память, но нарушает совместимость. Объекты POD быстрее создаются и копируются, чем объекты управляемой структуры данных.
C++20: POD типа уже не будет, останутся только тривиальный тип и тип со стандартным устройством.
Имеет характеристики: тривиального класса/структуры (trivial type) + со стандартным устройством (standard layout).

Trivial type

Тривиальный класс/структура (std::is_trivial) - занимает непрерывную область памяти, поэтому компилятор может самостоятельно выбирать способ упорядочивания членов Характеристики: — конструктор: явно отсутствующий или явно задан как default. — копирующий конструктор: явно отсутствующий или явно задан как default. — перемещающий конструктор: явно отсутствующий или явно задан как default. — копирующий оператор присваивания: явно отсутствующий или явно задан как default. — перемещающий оператор присваивания: явно отсутствующий или явно задан как default. — деструктор: явно отсутствующий или явно задан как default.

  • все поля и базовые классы — тоже тривиальные типы.
  • все поля класса - не инициализированны.
  • поля могут иметь разный модификатор доступа (public/protected/private).
  • не имеет виртуальных методов (включая деструктор).
  • не имеет виртуальных базовых типов (класс/структура).

Standard layout

Класс/структура со стандартным устройством (std::is_standard_layout). Характеристики:

  • не имеет виртуальных методов.
  • не имеет виртуальных базовых типов (класс/структура).
  • не имеет полей-ссылок.
  • все поля имеют одинаковый модификатор доступа (public/protected/private).
  • нельзя наследоваться от наследуемого класса/структуры.
  • все поля и базовые классы — тоже типы со стандартным устройством.

RVO/NRVO

RVO

Return Value Optimization - оптимизация возвращаемого значения. Компилятор при создании и возвращения в точке вызова return временного значения (rvalue) оптимизирует код, не вызывая лишние конструкторы копирования/перемещения, а вместо этого сразу вызывает конструктор в точке вызова функции.

NRVO

Named Return Value Optimization - именнованная оптимизация возвращаемого значения. Компилятор при создании и возвращения локальной переменной (lvalue) оптимизирует код, не вызывая лишние конструкторы копирования/перемещения, а вместо этого сразу вызывает конструктор в точке вызова функции.

До 17-го стандарта RVO/NRVO было рекомендацией для компилятора, а в C++17 стало обязательной оптимизацией и по умолчанию включена. Отключить её можно при помощи флага компиляции -fno-elide-constructors.

Условия для оптимизации:

  • при NRVO возвращаться должен ТОЛЬКО локальный объект, а не ссылка на него или какая-то его часть.
  • при NRVO возвращаемый объект не должен быть volatile и нельзя использовать std::move.
  • при RVO возвращаемый объект структуры/класса не должен иметь explicit конструктор.

Видео:

Уроки С++. Изучай и оптимизируй! Советы С++. POD типы

Сайты:

Тривиальные типы, типы стандартной структуры, POD и типы литералов
Шпаргалка по аббревиатурам C++ и не только. Часть 1: C++
Разбор понятий: trivial type, standard layout, POD
Простая структура данных
RVO/NRVO