-
- у каждого компилятора и проца есть предефайны вот от них и танцевать abivan(147 знак., 09.03.2022 11:59)
- Возможно так, хотя гарантии нет. sizeof(struct{char a[1];int b[1]}) - AlexBi(08.03.2022 13:51)
- Для нашего проца получите 2... И что это вам даст?!? - sav6622(08.03.2022 22:57)
- так не работает же sizeof в препроцессоре! (почему-то) - Argon(08.03.2022 22:04)
- Почему надо именно в препроцессоре? Обычно константные выражения,
вместе с if(... успешно оптимизируются, работая почти как
препроцессор. - AlexBi(08.03.2022 22:09)
- ну потому что надо объявить структуру... - Argon(08.03.2022 22:13)
- Почему надо именно в препроцессоре? Обычно константные выражения,
вместе с if(... успешно оптимизируются, работая почти как
препроцессор. - AlexBi(08.03.2022 22:09)
- нет гарантии - компиллер с линкером имеет право договорится и разложить так чтобы выполнить оптимизацию для использования быстрых инструкций чтения записи проца и инфу об модели адресации - толко принудительно аттрибутами "pack" можно заставить, есть экзотический путь - описать в ассемблерном файле раскладку полей - klen(08.03.2022 14:38)
- Это вопрос не возможности, а необходимости. Зачем? Задачи, когда
желательно знать разрядность МК, чтобы повысить эффективность кода
решаются без препроцессора. Если все-таки хочется, то это можно
сделать, включив в файл compiler.h (свой для разных компиляторов)
соответствующее #define - il-2(08.03.2022 10:55)
- Подумалось, а вдруг это возможно это без внедрения дополнительных
сущностей? - Argon(08.03.2022 10:58)
- Ага, похоже, таки, возможно через макро INT_MAX в limits.h - Argon(08.03.2022 11:06)
- 8-битник не определишь. int минимум 16-бит, и у 8-битников тоже. И
выравниваться по 2-м байтам он у 8-битников не будет. - il-2(08.03.2022 13:10)
- А, ну да, у 16-битника ведь тоже int - 16 бит. Блин. Но мне пока
надо различать только 8 и 32-битники. 16 могут и не понадобиться.
Тем не менее, перфекционизма ради, видимо следует внедрить
дополнительную сущность вида compiler.h. - Argon(08.03.2022 13:15)
- Я уже говорил, что в наличии платформа, где bool=char=int=long=32
бита - sav6622(09.03.2022 15:13)
- и что самое обидное еще и float. - Nikolay801_(09.03.2022 15:32)
- Я уже говорил, что в наличии платформа, где bool=char=int=long=32
бита - sav6622(09.03.2022 15:13)
- А, ну да, у 16-битника ведь тоже int - 16 бит. Блин. Но мне пока
надо различать только 8 и 32-битники. 16 могут и не понадобиться.
Тем не менее, перфекционизма ради, видимо следует внедрить
дополнительную сущность вида compiler.h. - Argon(08.03.2022 13:15)
- на мой взгляд лучше анализировать в коде множество предопределенных
макросов, которые устанавливаются согласно указанном таргету
компиляции klen(17228 знак., 08.03.2022 12:21)
- ну да, можно и так, спасибо - Argon(08.03.2022 12:24)
- 8-битник не определишь. int минимум 16-бит, и у 8-битников тоже. И
выравниваться по 2-м байтам он у 8-битников не будет. - il-2(08.03.2022 13:10)
- Ага, похоже, таки, возможно через макро INT_MAX в limits.h - Argon(08.03.2022 11:06)
- Подумалось, а вдруг это возможно это без внедрения дополнительных
сущностей? - Argon(08.03.2022 10:58)
- А какая конечная цель? Что вы будете делать зная разрядность? - AlexG(08.03.2022 10:54)
- Это для портабельности исходника. Точнее - для идентичного
выравнивания структур для 8 и 32 битных чипов - Argon(08.03.2022 10:57)
- Для этого достаточно явным образом напихать в структуры поля для
выравнивания. - SciFi(08.03.2022 12:04)
- пока так и сделал - Argon(08.03.2022 12:08)
- Задача решена, но перфекционизьм всё равно зудит? Бывает :-) SciFi(1 знак., 08.03.2022 12:12, youtube)
- да постоянно ) - Argon(08.03.2022 12:18)
- Задача решена, но перфекционизьм всё равно зудит? Бывает :-) SciFi(1 знак., 08.03.2022 12:12, youtube)
- пока так и сделал - Argon(08.03.2022 12:08)
- #pragma pack и типы данных с точно известным размером из stdint.h. AlexG(60 знак., 08.03.2022 11:15)
- В том и дело, что типы некоторых данных из структуры имеют разный
размер в разных архитектурах. С порядком байт буду разбираться
позже, если будет такая проблема, придется "костылить". - Argon(08.03.2022 11:22)
- пример можно увидеть ? про разный размер ? - Zoro(08.03.2022 15:01)
- Вот. Ща начнется "гавнакот, гавнакот!" )) Argon(371 знак., 08.03.2022 15:34)
- можно попробовать хранить не непосредственно void *data, а
uint32_t, из которого получать потом указатель преобразованием
типов или адресной арифметикой - AlexG(08.03.2022 20:43)
- Можно, но вроде нет принципиальной разницы с текущим вариантом. - Argon(08.03.2022 20:55)
- разница в том, что размер переменной заранее известен и фиксирован,
в отличии от указателя. - AlexG(08.03.2022 21:07)
- а если применить sizeof(*char) ? Zoro(98 знак., 08.03.2022 21:29)
- sizeof в препроцессоре не работает - Argon(08.03.2022 21:47)
- #include <stdio.h> Zoro(189 знак., 09.03.2022 00:00)
- Ну так-то я много раз сказал про препроцессор (языка C конечно же). - Argon(09.03.2022 00:05)
- ок. значит о разном. - Zoro(09.03.2022 00:23)
- Ну так-то я много раз сказал про препроцессор (языка C конечно же). - Argon(09.03.2022 00:05)
- #include <stdio.h> Zoro(189 знак., 09.03.2022 00:00)
- sizeof в препроцессоре не работает - Argon(08.03.2022 21:47)
- у меня первичное - 8-битные девайсы, их напрягать 32 битной переменной нафиг-нафиг )) - Argon(08.03.2022 21:20)
- а если применить sizeof(*char) ? Zoro(98 знак., 08.03.2022 21:29)
- разница в том, что размер переменной заранее известен и фиксирован,
в отличии от указателя. - AlexG(08.03.2022 21:07)
- Можно, но вроде нет принципиальной разницы с текущим вариантом. - Argon(08.03.2022 20:55)
- можно попробовать хранить не непосредственно void *data, а
uint32_t, из которого получать потом указатель преобразованием
типов или адресной арифметикой - AlexG(08.03.2022 20:43)
- Вот. Ща начнется "гавнакот, гавнакот!" )) Argon(371 знак., 08.03.2022 15:34)
- Ээээ, как uint8_t в упакованном структуре будет иметь разный размер
на разных архитектурах? - POV(08.03.2022 11:47)
- а при чем здесь uint8_t? - Argon(08.03.2022 12:02)
- А что же у тебя за типы разные на разных платформах? Используй
stdint.h - POV(08.03.2022 16:27)
- ) ну вон же -> Argon(1 знак., 08.03.2022 16:34, ссылка)
- А что же у тебя за типы разные на разных платформах? Используй
stdint.h - POV(08.03.2022 16:27)
- а при чем здесь uint8_t? - Argon(08.03.2022 12:02)
- пример можно увидеть ? про разный размер ? - Zoro(08.03.2022 15:01)
- В том и дело, что типы некоторых данных из структуры имеют разный
размер в разных архитектурах. С порядком байт буду разбираться
позже, если будет такая проблема, придется "костылить". - Argon(08.03.2022 11:22)
- Для этого достаточно явным образом напихать в структуры поля для
выравнивания. - SciFi(08.03.2022 12:04)
- Это для портабельности исходника. Точнее - для идентичного
выравнивания структур для 8 и 32 битных чипов - Argon(08.03.2022 10:57)