OberonCore https://forum.oberoncore.ru/ |
|
Нужно ли выравнивание полей в структурах https://forum.oberoncore.ru/viewtopic.php?f=61&t=5450 |
Страница 1 из 1 |
Автор: | Rifat [ Четверг, 16 Июль, 2015 17:20 ] |
Заголовок сообщения: | Нужно ли выравнивание полей в структурах |
В книги Вирта "Конструирование компиляторов" есть глава о том, как данные представляются во время исполнения, где говорится, что если данные не выровненные, то может потребоваться два обращения к памяти, для чтения какого-нибудь поля и необходимо выравнивать поля в структурах по границе слов. Допустим, есть структура RECORD a: CHAR; b: INTEGER END; то поле a, допустим будем иметь смещение 0 (от начала структуры), а поле b смещение 4. Чаще всего никто не обращает на это никакого внимания, но иногда требуется передавать данные между различными системами и может так случится, что настройки выравнивания там другие. В языке C++ есть специальная конструкция для задания параметров выравнивания #pragma pack(x) И мне пришла идея, а почему бы не отказаться от автоматического выравнивания, а выравнивать поля всегда явно. Если кто-то хочет, чтобы обращение к полю b происходило по адресу кратному 4, то можно просто создать структуру RECORD a: CHAR; dummy: ARRAY 3 OF CHAR; b: INTEGER END; а по умолчанию выравнивание не использовать. В этом случае размер структуры всегда будет равен сумме размеров его членов, а не округленному в большую сторону размеру. И можно будет создавать такие типы данных, как, например, WCHAR = RECORD c1, c2: CHAR END и использовать массив таких символов, как аналог типа wchar_t. Кто что думает по этому поводу? |
Автор: | ilovb [ Четверг, 16 Июль, 2015 21:10 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
Между какими системами вы собрались данные передавать? И почему протокол передачи зависит от выравнивания? |
Автор: | Rifat [ Пятница, 17 Июль, 2015 11:43 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
Проблема с выравниванием возникает при передаче данных из программы, написанной на одном языке программирования, в программу на другом. Вот, пример: http://rsdn.ru/forum/philosophy/6075407.1 |
Автор: | Роман М. [ Воскресенье, 19 Июль, 2015 12:40 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
Уплотнение полей записи должно быть опциональным, поскольку зависит от реализации компилятора. В БлэкБоксе выравнивание полей задаётся уточняющим системным флагом к записи в квадратных скобках (требуется подключение модуля SYSTEM). Т.е., Код: T = RECORD [align2] (* ... *) END Для взаимодействия со сторонним ПО, использование модуля SYSTEM в Оберонах просто неизбежно. |
Автор: | Пётр Кушнир [ Воскресенье, 19 Июль, 2015 12:57 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
В 2015-м году люди все ещё вынуждены взаимодействовать с системами 70-х годов, раскладывать байты и специализировать компиляторы на совместимость с низкоуровневыми экосистемами. При всем при этом негативную оценку получает не сама экосистема, а модуль SYSTEM в Обероне, который по большому счету обычному человеку нужен только чтобы соединяться с Си. Не слишком-то прогрессивный подход, обвинять в недостаточной интегрированности в позор индустрии. |
Автор: | ilovb [ Воскресенье, 19 Июль, 2015 14:31 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
Rifat писал(а): Проблема с выравниванием возникает при передаче данных из программы, написанной на одном языке программирования, в программу на другом. Думается, что это больше к конкретным компиляторам относится, чем к языкам. Зачем привязывать язык к реализации? |
Автор: | prospero78 [ Пятница, 14 Август, 2015 09:42 ] |
Заголовок сообщения: | Re: Нужно ли выравнивание полей в структурах |
В одной из веток уже эта тема поднималась. Не актуально. Современные камни успешно переваривают такие данные. И по времени, даже быстрее, чем выровненные по границам машинного слова -- попадание в кеш выгодней выравнивания. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |