-
- "good practice" в программировании на С это не "эфемерное", это оксюморон. Почувствуйте разницу. - Kpoк(31.05.2020 23:20)
- Сделал изначально какую-то херню, теперь ещё голову ломает. Я уже
говорил: 1) битовые структуры -- НЕ НУЖНЫ (адресуй нужный байтик и
маскируй в нём нужный битик); 2) упакованные структуры тем более НЕ
НУЖНЫ. 3) для эффективной адресации нужно завести не массив
структур, а коллекцию (структуру) массивов для разных элементов
твоих структур (т.е. массив первых элементов структур, массив
вторых...), тогда всё эффективно адресуается без битовых полей, без
упаковки и прочей fk0(7 знак., 31.05.2020 21:03)
- Говорят, в аду есть особое место для преобразующих array of struct
в struct of arrays... =) Второй уж раз это извращение вижу от тебя
я. Падаванов совращаешь ты зачем? - RxTx(31.05.2020 22:42)
- Нормальный вариант, я уже совращенный. Но не для этого случая. - VLLV(01.06.2020 13:06)
- Это где-нибудь в скрытом от взглядов коде микроконтроллера имени
одного погромиста "нормально". В виденных проектах за хуеблудство: RxTx(554 знак., 01.06.2020 13:45, ссылка)
- Не нужно лечить :) Очень удобно параметрами X-макросов набивать
разную хрень, собственно они так и работают и для этого
предназначены. - VLLV(01.06.2020 13:50)
- Еще и на макросах дабы скрыть бесовство своё. К пистолету рука моя
тянется. - RxTx(01.06.2020 14:11)
- Поэт :) - VLLV(01.06.2020 22:10)
- Еще и на макросах дабы скрыть бесовство своё. К пистолету рука моя
тянется. - RxTx(01.06.2020 14:11)
- Оно как раз быстрей работает, в плане локальности, если данные
перебираются преимущественно по одному полю, например. И доступ
более эффективен (считай голый указатель, а
структура-структур-структур может вырождаться в рантаймовые
вычисления смещений). - fk0(01.06.2020 13:48)
- Доступ к каждому [n] каждый раз по базе индексировать будет. А если
несколько полей, несколько указателей нужно, не уместятся в
регистры и каждый указатель апдейтить нужно.. Мммм? RxTx(324 знак., 01.06.2020 13:58)
- Регистр нужен ОДИН. Потому, как и в массиве структур, и в структуре
массивов с константной длиной массива расстояние между членами
одной структуры -- константа времени компиляции. Только в одном
случае она влазит в байт, во втором в два-четыре. Если компилятор
не понимает -- можно аксессоры на C++ написать, где constexpr
вылезет в явном виде. Можно руками закодить в C. И да, на спектруме
тоже нужен один регистр. Разные поля адресуются через LD A,H : ADD
A,#nn : LD H,A. Если fk0(329 знак., 01.06.2020 14:04)
- Индексный всмысле? Если захардкодить смещения между массивами?
Стоп-стоп, давай без напёрстничества. А то уже началось "руками
закодить". Ты без хардкода смещений чистый цэ код скомпиляй и
покажи, какой оне у компилера на выходе будет "один". Тыж понимаешь
что компилер о взаимных массивах ничего знать не будет, это знание
только у тебя в голове. А когда struct{} - тогда знает. Насчет
два-четыре байта смещения по индексу, говоришь? А поля инструкций
не резиновые, большие RxTx(822 знак., 01.06.2020 14:55)
- Да, захардкодить смещение между массивами. С чистым C язык не
позволяет, нужно полагаться на сообразительность компилятора (по
ссылке в районе 104 строки видно, что она есть -- разные члены
структуры-массива адресуются путём прибавления большого смещения).
В C++ всё можно сделать, в смысл объяснить детали компилятору и
заставить его делать именно так. fk0(847 знак., 01.06.2020 23:18, ссылка)
- Я так и знал что ты пропадал так и эдак задрачивая godbolt и компиляторы. =) Тут у нас обсуждаемый момент сдвинулся в новые области. Я не говорил и не считаю что подобное streamed хранение данных якобы всегда проблемно. Совсем нет, и в копьютерной графике например (GPU), хранение текстур/буферов в виде rrrrr bbbbb gggg wwww довольно часто встречается (или floating point застримленных по частям) или даже выкушенных и сохраненных рядом битов из байт (т.е. RxTx(1155 знак., 01.06.2020 23:54)
- Да, захардкодить смещение между массивами. С чистым C язык не
позволяет, нужно полагаться на сообразительность компилятора (по
ссылке в районе 104 строки видно, что она есть -- разные члены
структуры-массива адресуются путём прибавления большого смещения).
В C++ всё можно сделать, в смысл объяснить детали компилятору и
заставить его делать именно так. fk0(847 знак., 01.06.2020 23:18, ссылка)
- Индексный всмысле? Если захардкодить смещения между массивами?
Стоп-стоп, давай без напёрстничества. А то уже началось "руками
закодить". Ты без хардкода смещений чистый цэ код скомпиляй и
покажи, какой оне у компилера на выходе будет "один". Тыж понимаешь
что компилер о взаимных массивах ничего знать не будет, это знание
только у тебя в голове. А когда struct{} - тогда знает. Насчет
два-четыре байта смещения по индексу, говоришь? А поля инструкций
не резиновые, большие RxTx(822 знак., 01.06.2020 14:55)
- Регистр нужен ОДИН. Потому, как и в массиве структур, и в структуре
массивов с константной длиной массива расстояние между членами
одной структуры -- константа времени компиляции. Только в одном
случае она влазит в байт, во втором в два-четыре. Если компилятор
не понимает -- можно аксессоры на C++ написать, где constexpr
вылезет в явном виде. Можно руками закодить в C. И да, на спектруме
тоже нужен один регистр. Разные поля адресуются через LD A,H : ADD
A,#nn : LD H,A. Если fk0(329 знак., 01.06.2020 14:04)
- Доступ к каждому [n] каждый раз по базе индексировать будет. А если
несколько полей, несколько указателей нужно, не уместятся в
регистры и каждый указатель апдейтить нужно.. Мммм? RxTx(324 знак., 01.06.2020 13:58)
- Не нужно лечить :) Очень удобно параметрами X-макросов набивать
разную хрень, собственно они так и работают и для этого
предназначены. - VLLV(01.06.2020 13:50)
- Это где-нибудь в скрытом от взглядов коде микроконтроллера имени
одного погромиста "нормально". В виденных проектах за хуеблудство: RxTx(554 знак., 01.06.2020 13:45, ссылка)
- Нормальный вариант, я уже совращенный. Но не для этого случая. - VLLV(01.06.2020 13:06)
- Предложение 3 в данном случае не катит, все данные двумя большими
пакетами (весь массив разбит на две части) ходят в протоколе. - VLLV(31.05.2020 21:15)
- Сразу все свои требования писать нужно. Включая компилятор, камень и внутренний ли это код или протокольный. - RxTx(31.05.2020 22:36)
- Для протокола ничего не мешает сериализовать и десериализовать как нужно. А не пытаться в протокол пихать как есть порождая массу сложностей при обычном обращении. - fk0(31.05.2020 22:08)
- Говорят, в аду есть особое место для преобразующих array of struct
в struct of arrays... =) Второй уж раз это извращение вижу от тебя
я. Падаванов совращаешь ты зачем? - RxTx(31.05.2020 22:42)
- Зачем копирование в первом варианте? Доступ к чему по индексу
должен быть? К байтам? Или к битам (ХЗ как)? Nikolay_Po(450 знак., 31.05.2020 17:51)
- В моем случает так не получается, т.к. поля уже определены и они с
переходом через границу байта, т.е. uint8_t x:5 не могу, нужно
uint32_t x:5, но тогда размер битовой структуры получается 4 байта
и все это не работает. Чтобы эту проблему решить, и используется
копирование - там лишний байт не мешает. - VLLV(31.05.2020 19:23)
- так общий размер структуры кратен размеру байта или нет? - Nikolay801_(01.06.2020 11:15)
- Равен! Но он равен 4. Смею утверждать, что добиться нужного
расположения полей и утоптать структуру в 3 байта невозможно. Кто
хочет, может потренироваться. VLLV(65 знак., 01.06.2020 12:39)
- Бойся своих желаний: PS: на x64 из-за невыравненности падает только на printf, но это проблема самой libc: - fk0(01.06.2020 13:37, ссылка, ссылка)
- Если уж хочется экономии памяти, почему бы не утоптать в 20 бит. И по адресу/смещению выгрызать нужное поле. И более универсально будет, если через геттер/сеттер, как fk0 предложил. - Andreas(01.06.2020 13:06)
- То есть полезная нагрузка 20 бит, но хранится в 3 байтах, по этому
еще есть довесок в 4 бита? - Nikolay801_(01.06.2020 12:59)
- Я бы эти 4 бита тоже к полезным отнес, проблема в 8 битах
четвертого байта, вот они точно довесок. - VLLV(01.06.2020 13:04)
- Если в правильных местах расставить packed, довеска быть не должно.
Логично? >>> SciFi(62 знак., 01.06.2020 13:12)
- Логично, но уже не очень просто (протокольные данные). Если делать
промежуточный вариант структуры после парсинга протокола, то
структуры обычной, а не битовой. - VLLV(01.06.2020 13:24)
- Немного усложняем: SciFi(122 знак., 01.06.2020 13:33)
- Вот это интересно, спасибо. - VLLV(01.06.2020 13:39)
- Немного усложняем: SciFi(122 знак., 01.06.2020 13:33)
- Логично, но уже не очень просто (протокольные данные). Если делать
промежуточный вариант структуры после парсинга протокола, то
структуры обычной, а не битовой. - VLLV(01.06.2020 13:24)
- Если в правильных местах расставить packed, довеска быть не должно.
Логично? >>> SciFi(62 знак., 01.06.2020 13:12)
- Я бы эти 4 бита тоже к полезным отнес, проблема в 8 битах
четвертого байта, вот они точно довесок. - VLLV(01.06.2020 13:04)
- Не использовать битовые поля, написать сеттеры-геттеры для работы с
полями. В ПЯТЫЙ РАЗ ПОВТОРЯЮ. НЕ ИСПОЛЬЗОВАТЬ БИТОВЫЕ ПОЛЯ. - fk0(01.06.2020 12:47)
- Знаешь что, Доцент, ты, конечно, вор авторитетный, но зачем ты при
Мишке?(с) abivan(431 знак., 01.06.2020 15:03)
- Нарваться на несовместимость битовых полей можно на одном
компиляторе при переходе с версии на версию: см 4-й пункт сверху
--> - fk0(01.06.2020 22:04, ссылка)
- я всегда явно дополняю падинг биты. А у компилятора баги и не
только в битовых полях могут быть. abivan(232 знак., 01.06.2020 22:41)
- Проблема в том, что конкретные особенности реализации битовых полей
-- никем не гарантируются. Компилятор имеет полное право битовые
поля хранить как текст на русском матерном языке, если авторы
захотят. - fk0(01.06.2020 23:23)
- А ещё кирпич на голову может упасть. Поэтому из дома не выходи. - SciFi(02.06.2020 08:45)
- A потом тут ноют (с чего топик и начался), памажите люди добры, не работает. - fk0(02.06.2020 11:27)
- А ещё кирпич на голову может упасть. Поэтому из дома не выходи. - SciFi(02.06.2020 08:45)
- Проблема в том, что конкретные особенности реализации битовых полей
-- никем не гарантируются. Компилятор имеет полное право битовые
поля хранить как текст на русском матерном языке, если авторы
захотят. - fk0(01.06.2020 23:23)
- я всегда явно дополняю падинг биты. А у компилятора баги и не
только в битовых полях могут быть. abivan(232 знак., 01.06.2020 22:41)
- Нарваться на несовместимость битовых полей можно на одном
компиляторе при переходе с версии на версию: см 4-й пункт сверху
--> - fk0(01.06.2020 22:04, ссылка)
- Спасибо, вот наконец то прямой ответ ;) А почему? - VLLV(01.06.2020 12:56)
- потому что тогда код писанный для мсп430 не сможет работать на SPARC, на котором его никогда не будут использовать. Nikolay801_(30 знак., 01.06.2020 13:40)
- Знаешь что, Доцент, ты, конечно, вор авторитетный, но зачем ты при
Мишке?(с) abivan(431 знак., 01.06.2020 15:03)
- sizeof(struct foobar) == 1.83? O_o - SciFi(01.06.2020 11:37)
- 1.875 Nikolay801_(97 знак., 01.06.2020 11:49)
- Равен! Но он равен 4. Смею утверждать, что добиться нужного
расположения полей и утоптать структуру в 3 байта невозможно. Кто
хочет, может потренироваться. VLLV(65 знак., 01.06.2020 12:39)
- так общий размер структуры кратен размеру байта или нет? - Nikolay801_(01.06.2020 11:15)
- В моем случает так не получается, т.к. поля уже определены и они с
переходом через границу байта, т.е. uint8_t x:5 не могу, нужно
uint32_t x:5, но тогда размер битовой структуры получается 4 байта
и все это не работает. Чтобы эту проблему решить, и используется
копирование - там лишний байт не мешает. - VLLV(31.05.2020 19:23)
- я бы сделал (и делаю) прямой как шпала тайпкаст кaлян(213 знак., 31.05.2020 15:29, )
- перестанет работать на типах длиннее 1 байта - 3m(01.06.2020 13:45)
- А разве сами данные не надо массивом из 3072 uint8_t объявить? А то
получается, что массив указателей на данные есть, а вот самих
данных - нет. Ну или астериск из объявления массива arr[1024]
убрать. - Nikolay_Po(31.05.2020 17:56)
- Да * там лишняя, Спасибо. - Nikolay801_(01.06.2020 11:12)
- Не адресуй указателями packed struct'ы/bitfields, в этом проблема. (Обращение по индексу это форма обращения по указателю). - RxTx(31.05.2020 12:29, ссылка)
- 1) Я бы делал memcpy. 2) Раз уж речь о "good practice", порядок
заполнения битовых полей implementation-defined, то есть строго
говоря неясно, какой байт лишний -- нулевой или третий. - SciFi(31.05.2020 12:09)
- 2) ни разу не встречал. - VLLV(31.05.2020 19:24)
- 3) Обернуть это в
методыфункции set_field/get_field, внутри которых что юнион, что битовые операции - одинаково читабельно. - Cкpипaч(31.05.2020 11:53) - ну я в таком случае смержил бы оба пункта, 1) определил бы
фиктивный union на uint32: битовые поля, сташий байт пустой. а
потом с его помощью опредял бы указатель на 3 байтовый элемент
массива массивов. далее как сказано компилятор сам вытащит значения
полей. ничего копировать не надо. лошадь сильная - пущайй сама и
двигает биты и OR над ними делает. - klen(31.05.2020 01:04)
- Увы, это как раз и не работает (hardfault из-за невыравненного
доступа) - VLLV(31.05.2020 08:53)
- а ежели так, то по любому не получится в исходном массиве
разбираться по отдельным кускам, ибо 3 не четное и через одно будет
залет на хард фаулт, только через копию. Nikolay801_(337 знак., 01.06.2020 11:35)
- Ну я же могу сделать и так VLLV(238 знак., 01.06.2020 12:52)
- можете, но и компилятор тоже может, а он железный пускай пашет. - Nikolay801_(01.06.2020 13:30)
- Ну я же могу сделать и так VLLV(238 знак., 01.06.2020 12:52)
- А что за ядро? ARMv6 и выше, по идее, умеют в невыравненный доступ. - s_h_e(31.05.2020 09:57)
- мсп430, там живет такой прикол - кaлян(31.05.2020 15:28, )
- а ежели так, то по любому не получится в исходном массиве
разбираться по отдельным кускам, ибо 3 не четное и через одно будет
залет на хард фаулт, только через копию. Nikolay801_(337 знак., 01.06.2020 11:35)
- Увы, это как раз и не работает (hardfault из-за невыравненного
доступа) - VLLV(31.05.2020 08:53)