Ответ 1
В общем случае, согласно C11
, для любой главы неинициализированного объекта §6.2.6.1/6,
Когда значение хранится в объекте структуры или типа объединения, в том числе в члене объект, байты представления объекта, которые соответствуют любым байтам заполнения неопределенные значения.
Но, если частичная инициализация выполнена, в этом случае для остальной части членов, инициализация происходит так, как если бы объект имел статическую или длительность хранения потоков, а затем, цитируя тот же стандарт, главу §6.7.9/21
Если в списке, заключенном в фигурные скобки, меньше инициализаторов, чем элементов или элементов совокупности или меньше символов в строковом литерале, используемом для инициализации массива известных размера, чем есть элементы в массиве, остальная часть совокупности должна быть инициализируется неявно так же, как и объекты, имеющие статическую продолжительность хранения.
и относительно неявной инициализации объектов со статической продолжительностью хранения, параграф 10
Если объект, который имеет статическую или длительность хранения потоков, не инициализируется явно, тогда:
- если он является агрегатом, каждый член инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
Итак, в вашем случае отступы для остальных объектов гарантированно равны 0, но не для членов, которые получили инициализаторы.
Итак, во всем, вы не должны зависеть от неявной инициализации 0, используйте memset()
.
При этом, в любом случае, не рекомендуется (требуется) зависеть от байтов заполнения, если таковые имеются. Используйте точные переменные-члены и вычислите хэш на основе этих значений.