Zero initialization



Решил начать в нулевой инициализации, так как она как будто бы самая простая и понятная.



Выполняется она после попытки выполнить константную инициализацию глобальных объектов и представляет из себя 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