PDA

Просмотр полной версии : Размер структуры (типа данных)



izwerg
29.10.2017, 17:28
Раньше никогда не обращал внимания, но заметил, что размер любого экземпляра структуры (который sizeof() определяет) кратен 4. То есть структура состоящая из одной переменной типа bool - 4 байта. Одна переменная типа real - те же 4 байта. А если одна real и одна bool - сразу 8 байт. Это всегда так?
может ли оказаться что размер структуры - нечетное число байт?

rwg
29.10.2017, 18:00
Однажды по молодости безуспешно пытался передать по модбасу структуру Word,DWord из ПЛК (CoDeSys 2) в СПК (CoDeSys 3). Заработало после замены в ПЛК Word на DWord.

ribamuka
02.11.2017, 23:08
CodeSys 2 + ПЛК100 выравнивание структуры в памяти всегда по четырем байтам.
В CodeSys 3 возможно задать параметы выравнивания структуры и можно добиться того, что выравнивание будет в 1 байт.

Зинько Владислав
07.11.2017, 01:09
Добрый день!

Действительно, выделение памяти в ПЛК для структур происходит строго с шагом в 4 байта.
Как было уже указано выше, это происходит из-за выравнивания памяти в контроллере.

При выравнивании учитывается выделяемая память под конкретную переменную и переменные, находящиеся выше. Если две переменные по суммарному объему занимают более 4 байт – происходит выравнивание и вторая переменная переопределяется в следующих 4 байтах.
Работает это следующим образом:
34002
Поэтому для более эффективного использования памяти контроллера, необходимо учитывать выравнивание и группировать переменные по типу данных при объявлении в структуре.
Ниже приведена оптимизация вышеупомянутого примера:
34003
Таким образом память, выделяемая под структуру, уменьшилась с 16 байт, до 12 байт.