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/