-
- Показываю. Последнее поле в структуре 1 байт, расположен со
смещением 5170-49d0 = 7a0 = 1952. Какой должен быть размер
структуры? 1956, логично? А вот ни хрена, 1960. VLLV(1 знак., 30.04.2020 17:45, картинка)
- Размер структуры растягивается до значения его alignas которое
определяется всеми полями в совокупности. Это нужно, чтоб можно
было адресовать массивы структур как v[i] = (char*)v +
i*sizeof(struct). Если бы у тебя sizeof() давал честный размер, то
как бы ты работал с массивами? fk0(70 знак., 30.04.2020 18:18, ссылка)
- Не, эта теория понятна, я больше недоумеваю, почему выравнивание
стало 8 вместо 4. - VLLV(30.04.2020 18:21)
- Потому, что внутри твоих вложенных структур нашлось что-то, чему нужно выравнивание на 8 байт. - fk0(30.04.2020 18:30)
- Не, эта теория понятна, я больше недоумеваю, почему выравнивание
стало 8 вместо 4. - VLLV(30.04.2020 18:21)
- Если в структуре есть 64-разрядное поле, то она вся должна иметь
такое выравнивание. Ну и размер, кратный 8 байтам. Одна из причин
для такого размера -- массив структур. - SciFi(30.04.2020 18:02)
- 1. С какого перепуга, если ядро не читает 8 байт за раз, а только 4
байта? 2. Не очень понятен процесс компиляции, в одном файле с этим
типом нет массива структур, в другом есть массив структур - как они
договариваются? - VLLV(30.04.2020 18:09)
- А какая связь вообще с байтами? Ты знаешь как оно внутри работает?
Может найтись масса неочевидных причин, почему иметь "некруглые"
адреса сложно. Пусть и читает по 4 байта за раз, но чтоб по 4 байта
считать длинное значение, long long, long double, вектор, и
обработать его последоательно нужно уметь вычитывать его отдельные
части. И куда проще это делать с выравненного адреса -- потому, что
достаточно правильным образом замаскировать младшие биты адреса, а
с fk0(723 знак., 30.04.2020 18:26)
- Убедил. Навскидку потери памяти с таким выравниванием не сильно
большие, должно жить. - VLLV(30.04.2020 18:35)
- В спортивном программировании вместо массивов структур лучше
"транспонировать" их в разнотипные массивы данных: во-первых места
займёт меньше, во-вторых адресация данных в коде станет более
эффективной. Пример: fk0(573 знак., 30.04.2020 18:47)
- Компромиссы в структурировании (а следовательно, и строгой типизации) недопустимы, товарищ ! - VLLV(30.04.2020 21:59)
- Может дать эффект только если полей мало. Иначе окажется что в процессоре ry и rz, подходящих для такой адресации очень мало, и для работы с одним элементом из массива потребуется частая перегрузка ry и rz. - AlexBi(30.04.2020 19:02)
- В спортивном программировании вместо массивов структур лучше
"транспонировать" их в разнотипные массивы данных: во-первых места
займёт меньше, во-вторых адресация данных в коде станет более
эффективной. Пример: fk0(573 знак., 30.04.2020 18:47)
- Убедил. Навскидку потери памяти с таким выравниванием не сильно
большие, должно жить. - VLLV(30.04.2020 18:35)
- Вроде бы в EABI такое записали. Иногда ссылаются на LDRD, STRD.
Можно ещё сослаться на Cortex-M7 и 64-разрядную шину AXI. В общем,
при желании причины найдутся. - SciFi(30.04.2020 18:09)
- Спасибо, начинает проясняться. In ARMv5TE, or in ARMv6 when SCTLR.U is 0, LDRD and STRD doubleword data transfers must be eight-byte aligned. Правда, у меня всего лишь STM32L4, а он CM4, правда есть FPU. - VLLV(30.04.2020 18:16)
- А какая связь вообще с байтами? Ты знаешь как оно внутри работает?
Может найтись масса неочевидных причин, почему иметь "некруглые"
адреса сложно. Пусть и читает по 4 байта за раз, но чтоб по 4 байта
считать длинное значение, long long, long double, вектор, и
обработать его последоательно нужно уметь вычитывать его отдельные
части. И куда проще это делать с выравненного адреса -- потому, что
достаточно правильным образом замаскировать младшие биты адреса, а
с fk0(723 знак., 30.04.2020 18:26)
- 1. С какого перепуга, если ядро не читает 8 байт за раз, а только 4
байта? 2. Не очень понятен процесс компиляции, в одном файле с этим
типом нет массива структур, в другом есть массив структур - как они
договариваются? - VLLV(30.04.2020 18:09)
- uint64_t в структуре есть? - abivan(30.04.2020 18:02)
- С ходу не вижу, хз, там столько вложений структур. Почему это должно влиять? - VLLV(30.04.2020 18:07)
- Размер структуры растягивается до значения его alignas которое
определяется всеми полями в совокупности. Это нужно, чтоб можно
было адресовать массивы структур как v[i] = (char*)v +
i*sizeof(struct). Если бы у тебя sizeof() давал честный размер, то
как бы ты работал с массивами? fk0(70 знак., 30.04.2020 18:18, ссылка)
- Показываю. Последнее поле в структуре 1 байт, расположен со
смещением 5170-49d0 = 7a0 = 1952. Какой должен быть размер
структуры? 1956, логично? А вот ни хрена, 1960. VLLV(1 знак., 30.04.2020 17:45, картинка)