Zero initialization
Решил начать в нулевой инициализации, так как она как будто бы самая простая и понятная.
Выполняется она после попытки выполнить константную инициализацию глобальных объектов и представляет из себя literally "зануление объекта".
Так как для этого вида установки значения объектам нет своего выделенного синтаксиса в языке, то вот примеры того, в каких ситуациях она может быть выполнена:
Примеров на самом деле больше, но так описано в стандарте, поэтому надо уважить дедов. И вот почему примеров больше.
Нулевая инициализация в любом случае проводится для всех глобальных переменных, если их нельзя константно проинициализировать, раньше всех остальных видов инициализации. То есть создали вы объект в глобальном скоупе, который динамически проинициализировали(в рантайме). В констукторе можно напихать все, что угодно(чего не было в примерах выше), но этот объект все равно будет проинициализирован нулями на этапе компиляции.
Также она проводится для массивов символьных типов, если инициализирующая строка слишком короткая. Остаток будет заполняться нулями.
Ну и про "зануление". У zero-initialization следующие эффекты:
👉🏿 Если T - скалярный тип, объект инициализируется результатом превидения численного литерала
👉🏿 Если T - кастомный тип, то:
1️⃣ все паддинги инициализируются битами-нулями.
2️⃣ для всех нестатических мемберов проводится zero-initialization(немного рекурсии, но все рано или поздно сводится к скалярным типам и массивам).
3️⃣для подобъектов каждого базы класса проводится zero-initialization.
👉🏿 Если Т - массив, то каждый элемент zero-инициализирутся.
👉🏿 Если Т - ссылка, то гоняем лысого(ЗАЧЕРКНУТЬ)ничего не делаем.
Обычно zero-инициализированные объекты находятся в .bss секции бинарника, которую иногда обзывают .zerofill секцией.
Как и говорил, довольно просто, но это знание будет полезно в дальшейших статьях.
Stay useful. Stay cool.
#cppcore
Решил начать в нулевой инициализации, так как она как будто бы самая простая и понятная.
Выполняется она после попытки выполнить константную инициализацию глобальных объектов и представляет из себя literally "зануление объекта".
Так как для этого вида установки значения объектам нет своего выделенного синтаксиса в языке, то вот примеры того, в каких ситуациях она может быть выполнена:
static T object;
T();
T t= {};
T{};
CharT array[n] = "short-sequence";
Примеров на самом деле больше, но так описано в стандарте, поэтому надо уважить дедов. И вот почему примеров больше.
Нулевая инициализация в любом случае проводится для всех глобальных переменных, если их нельзя константно проинициализировать, раньше всех остальных видов инициализации. То есть создали вы объект в глобальном скоупе, который динамически проинициализировали(в рантайме). В констукторе можно напихать все, что угодно(чего не было в примерах выше), но этот объект все равно будет проинициализирован нулями на этапе компиляции.
Также она проводится для массивов символьных типов, если инициализирующая строка слишком короткая. Остаток будет заполняться нулями.
Ну и про "зануление". У zero-initialization следующие эффекты:
👉🏿 Если T - скалярный тип, объект инициализируется результатом превидения численного литерала
0
к типу T.👉🏿 Если T - кастомный тип, то:
1️⃣ все паддинги инициализируются битами-нулями.
2️⃣ для всех нестатических мемберов проводится zero-initialization(немного рекурсии, но все рано или поздно сводится к скалярным типам и массивам).
3️⃣для подобъектов каждого базы класса проводится zero-initialization.
👉🏿 Если Т - массив, то каждый элемент zero-инициализирутся.
👉🏿 Если Т - ссылка, то гоняем лысого(ЗАЧЕРКНУТЬ)ничего не делаем.
Обычно zero-инициализированные объекты находятся в .bss секции бинарника, которую иногда обзывают .zerofill секцией.
Как и говорил, довольно просто, но это знание будет полезно в дальшейших статьях.
Stay useful. Stay cool.
#cppcore