-
- Поинтеры нельзя, до линковки адреса не известны. Надо offsetof() использовать, но не все компиляторы (в том числе GCC) позволяют его совать в #if. (Кстати, второй элемент структуры д.б. int, иначе компилятор два char'а может спаковать) - testerplus(10.02.2011 14:39 - 14:42)
- Тогда спросить sizeof этой структуры. - Ксения(11.02.2011 01:47)
- С sizeof() то же самое - testerplus(11.02.2011 02:16)
- А что мешает проверять не препроцессором, а прямо в коде? в if() с константным выражением нормальный оптимизатор выкинет неиспользуемую ветку. - Cepгeй Бopщ(11.02.2011 11:13)
- Так целевой компилятор (для пик16) не имеет нормального оптимизатора (зато он-то как раз позволяет sizeof'ы и offsetof'ы использовать в #if'ах) - testerplus(11.02.2011 12:28)
- В исходном вопросе фигурировал язык С, а не компилятор "языка, похожего на С". - Cepгeй Бopщ(11.02.2011 16:12)
- Для PIC1x, как и для подавляющего большинства других восьмибитников, endianness определяется не архитектурой ядра, а реализацией конкретного компилятора, и может быть любым - MBedder(11.02.2011 13:24)
- Хер! Z80 например. LD HL, (xx) <-- какая ендианность? И у многих есть инструкции работы с указателями и 16-битными операндами. У некоторых правда нет (вон у x51 и KEIL ендианность вовсе для разных типов данных -- разная). - fk0(11.02.2011 14:41)
- Четай вдумчивей - специально указал "для подавляющего большинства", имея в виду, что в семье не без урода - MBedder(11.02.2011 18:37)
- Так вопрос не про endianness был, а про alignement - testerplus(11.02.2011 13:43)
- Для восьмибитников проблема выровненности отсутствует принципиально, ибо обращения всегда идут к объектам МИНИМАЛЬНОГО размера - MBedder(11.02.2011 18:35)
- Вот он и хочет 8-битнику подсунуть код попроще с приведением типа по невыровненному указателю - testerplus(11.02.2011 19:02, ссылка)
- Пафтаряйу: у восьмибитников невыровненного доступа быть не может по определению патамушта байты у них уже выровнены генетикой и проверены электроникой - MBedder(11.02.2011 19:48)
- У МИПСов-то не выровнены. Ему надо из потока байтов по невыровненному указателю вытащить long. Смотри: на МИПСе этого не сделать иначе, как testerplus(388 знак., 11.02.2011 21:17 - 22:03)
- Проверил из любопытства: PICC на оба варианта генерит примерно одинаковую херню. Так что смысла изворачиваться нет. - testerplus(11.02.2011 21:23 - 21:35)
- Подставился - AVR! ;) - Vladimir Ljaschko(11.02.2011 20:39)
- У МИПСов-то не выровнены. Ему надо из потока байтов по невыровненному указателю вытащить long. Смотри: на МИПСе этого не сделать иначе, как testerplus(388 знак., 11.02.2011 21:17 - 22:03)
- Пафтаряйу: у восьмибитников невыровненного доступа быть не может по определению патамушта байты у них уже выровнены генетикой и проверены электроникой - MBedder(11.02.2011 19:48)
- Вот он и хочет 8-битнику подсунуть код попроще с приведением типа по невыровненному указателю - testerplus(11.02.2011 19:02, ссылка)
- Кажется, уже не важно, о чём вопрос. Уже "всё смешалось: кони, люди" :-) - SciFi(11.02.2011 13:59)
- Для восьмибитников проблема выровненности отсутствует принципиально, ибо обращения всегда идут к объектам МИНИМАЛЬНОГО размера - MBedder(11.02.2011 18:35)
- Хер! Z80 например. LD HL, (xx) <-- какая ендианность? И у многих есть инструкции работы с указателями и 16-битными операндами. У некоторых правда нет (вон у x51 и KEIL ендианность вовсе для разных типов данных -- разная). - fk0(11.02.2011 14:41)
- Так целевой компилятор (для пик16) не имеет нормального оптимизатора (зато он-то как раз позволяет sizeof'ы и offsetof'ы использовать в #if'ах) - testerplus(11.02.2011 12:28)
- А что мешает проверять не препроцессором, а прямо в коде? в if() с константным выражением нормальный оптимизатор выкинет неиспользуемую ветку. - Cepгeй Бopщ(11.02.2011 11:13)
- С sizeof() то же самое - testerplus(11.02.2011 02:16)
- Тогда спросить sizeof этой структуры. - Ксения(11.02.2011 01:47)
- Поинтеры нельзя, до линковки адреса не известны. Надо offsetof() использовать, но не все компиляторы (в том числе GCC) позволяют его совать в #if. (Кстати, второй элемент структуры д.б. int, иначе компилятор два char'а может спаковать) - testerplus(10.02.2011 14:39 - 14:42)