Может ли изменение sizeof (bool) действительно сломать старый код?
Да.Довольно просто найти код, который предполагает неправильно что-то о размере bool
и (отсутствии) заполнения.
... был элемент important
, которыйОжидалось, что он будет иметь ширину 1B с помощью кода, который его установил (отсюда 1 нулевой байт), но в то же время ожидается, что он будет иметь ширину 4B (sizeof int
)
Даже есликод был до C99, размер определяемого кодом типа bool
должен был быть sizeof(bool)
или лучше как struct Foo f; sizeof(f.important)
, а не sizeof int
.
Далее, хотя код не показывает, как этиРазмеры были применены, другая проблема - отступы.Макеты могли бы быть
8 byte pointer, 1 byte bool, 7 padding
8 byte pointer, 4 byte bool, 0 padding
8 byte pointer, 4 byte bool, 4 padding
4 byte pointer, 1 byte bool, 3 padding
2 byte pointer, 4 byte bool, 0 padding
etc.
. Для лучшего кода использовалось бы offsetof()
, чтобы найти смещение, и sizeof(object.member)
, чтобы найти размер.