Короткий ответ на ваш первый вопрос - «нет».
Хотя соответствующий вызов memset()
, такой как memset(&some_struct_instance, 0, sizeof(some_struct))
, установит все байты в структуре на ноль, это изменение не обязательно должно быть постоянным после «некоторого использования» some_struct_instance
, такого какустановка любого из членов внутри него.
Так, например, нет гарантии, что some_struct_instance.some_enum = THREE
(то есть сохранение значения в элементе) оставит любые биты заполнения в some_struct_instance
неизменными.Единственным требованием в стандарте является то, что значения других членов структуры не затрагиваются.Однако компилятор может (в передаваемом объектном коде или машинных инструкциях) реализовать назначение, используя некоторый набор побитовых операций, и ему разрешено использовать ярлыки таким образом, чтобы не оставлять биты заполнения в одиночку (например, не испуская команды, которые могли быв противном случае убедитесь, что биты заполнения не затронуты).
Еще хуже, простое присвоение, подобное some_struct_instance = some_other_struct_instance
(которое по определению является сохранением значения в some_struct_instance
), не дает никаких гарантий относительно значенийбиты заполнения.Не гарантируется, что биты заполнения в some_struct_instance
будут установлены в те же битовые значения, что и биты заполнения в some_other_struct_instance
, и нет гарантии того, что биты заполнения в some_struct_instance
не будут изменены.Это связано с тем, что компилятору разрешено реализовывать присваивание любым способом, который он считает наиболее «эффективным» (например, дословное копирование памяти, некоторый набор присваиваемых элементам присваиваний или что-либо еще), но - поскольку значение битов заполнения после присвоения не указано- не требуется, чтобы гарантировать, что биты дополнения неизменны.
Если вам повезет, и игра с битами дополнения работает для вашей цели, это не произойдет из-за какой-либо поддержки в стандарте C.Это будет происходить из-за доброты поставщика компилятора (например, выбрав команду машинных инструкций, которые гарантируют, что биты заполнения не будут изменены).И практически нет никакой гарантии, что поставщик компилятора будет продолжать делать то же самое - например, ваш код, основанный на такой вещи, может сломаться при обновлении компилятора, при выборе других настроек оптимизации или чего-либо другого.
Поскольку ответ на ваш первый вопрос - «нет», нет необходимости отвечать на ваш второй вопрос.Однако с философской точки зрения, если вы пытаетесь сохранить данные в битах заполнения структуры, разумно утверждать, что кто-то еще - сумасшедший или нет - может потенциально попытаться сделать то же самоевещь, но используя подход, который портит данные, которые вы пытаетесь обойти.