Принятие у меня есть структура как следующее:
struct Struct {
char Char;
int Int;
};
и sizeof( int )
больше, чем один и компилятор добавляют дополнение для Char
членская переменная - сгенерированному компилятором коду позволяют изменить значения дополнительных байтов?
Я имею в виду, использую ли я адресную арифметику с указателями и пишу некоторые данные в дополнительные байты, окружающие Char
членская переменная и позже делает variable.Char =
присвоение - это возможный, что код, сгенерированный компилятором, также перезапишет некоторые дополнительные байты?
Следующее предложение является неправильным: Нет, оно не перезапишет байты подкладки. Но, вероятно, это не является хорошей практикой. Если вам это нужно, добавьте туда переменные-члены.
Я исследовал, основываясь на комментариях, указывающих (правильно) на то, что я глуп:
У С-стандарта есть "Приложение J" с разделом J.1 Неопределенное поведение. В нем сказано: "Значение байтов подкладки при хранении значений в структурах или объединениях". Подразумевается, что компилятор может генерировать любые инструкции по записи данных в структуру, что может позволить ему перезаписывать заполнение после члена.
- там точно что-то можно написать, а memset
- экземпляр такой структуры делает это. Однако, это небезопасно и никогда не является хорошей идеей делать это . Как-нибудь другой разработчик где-нибудь помещает #pragma
или добавляет член для структурирования объявления, и ваш код взорвется множеством странных и причудливых способов, что может занять довольно много времени на отладку.
Единственная причина для этого - что-то вроде плагина, злонамеренно заставляющего хост-приложение хранить дополнительные данные.
Не делайте этого, потому что в какой-то момент в будущем он сломается, и это станет серьезной головной болью для всех, кого это касается.
Что, если бы компилятор был достаточно умен, чтобы использовать слово write для сохранения char? Ваши тщательно сохраненные данные будут потеряны. ;-)
.