187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
|
||||||||||||||||
1 | ||||||||||||||||
sizeof на битовую структуру20.10.2012, 07:38. Показов 2130. Ответов 27
Метки нет (Все метки)
Данный код структуры :
0
|
20.10.2012, 07:38 | |
Ответы с готовыми решениями:
27
Sizeof(.) или constexpr size_t tmp = sizeof(.) Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) Можно ли на 32 битовую систему установить 64 битовую sql server? Как установить 32 битовую версию на 64 битовую ОС? |
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
21.10.2012, 10:37 | 21 |
Вот как раз нет. Лучше (с точки зрения эффективности кода) делать это именно ручками. В идеале, оформив в виде класса и inline методами. Битовые поля крайне неэффективны (по крайней мере там было в течении многих веков, возможно это уже не является проблемой для компилятора).
0
|
21.10.2012, 10:49 | 22 |
Любой современный компилятор с битовыми полями справится так же, как и с битовыми операциями. Старые компиляторы на intel'е навряд ли дадут выигрыш при работе с битовыми операциями, т.к. получается много промежуточных значений, а регистров мало и всё равно что-то начнёт попадать в стек
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||||||||||
21.10.2012, 12:09 | 23 | ||||||||||
Почти ни разу не пользовался битовыми полями, поэтому захотелось сравнить в "полевых" условиях.
Пример специально "запутан", чтобы компилятор не сумел оптимизировать то, чего сравнить хотелось.
Оставил только интересный фрагменты
Наименьшее число операций ри использовании типа unisgned int. При использовании int или (unsigned)short число операций возрастает для обоих методов. В общем, забиваем на всё и используем битовые поля, но только с типом unsigned int.
0
|
21.10.2012, 13:50 | 24 |
Я интеловский ассемблер как-то плохо понимаю, а потому вот так глядя на код немного не фтыкаю (надо моск напрягать). С виду по исходнику всё написано правильно и код не должен отличаться. Надо попробовать на свежую голову понять, почему при записи битовых полей код получился длиннее (там немного по математической части кумекать надо, может просто компилятор недостаточно качественно соптимизировал)
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
21.10.2012, 14:18 | 25 |
Присваивание значений какое-то мутное в битовых полях.
0
|
22.10.2012, 00:11 | 26 |
Ничего мутного нет
Расскажите про new и delete в C++
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
22.10.2012, 06:03 | 27 |
Так вручную же я те же самые операции делаю: считывание "подложки", обнуление соответствующих битов, сдвиг и добавление.
А в чём разница до меня дошло! Вручную я не проверял, что вводимое значение на корректность (размер в битах), а битовые поля проверку выполняют (and ecx, 31), на всякий случай обнуляя лишние биты. Если добавить код проверки в класс Color16bit, то вообще никакой разницы не будет между ручной реализацией и битовым полем. Так что забываю про то, что битовые поля не эффективные. Добавлено через 1 минуту А щяс и комментарий в твоей ссылке прочитал и дважды дошло.)
0
|
22.10.2012, 08:50 | 28 |
Да, проморгал я этот момент....
Единственная их неэффективность могла бы заключаться в том, что структуру компилятор чаще загоняет в стек, чем скалярное значение. В современных компиляторах это пофигу, а вот в старых в этом месте действительно могла просочиться неэффективность. А что касается чтения/записи полей, то на некоторых процессорах (где-то видел, но не помню, где именно) есть специальные операции для этого дела. Теоретически компилятор может и битовую арифметику к этим операциям свести, но практически надо проверять
0
|
22.10.2012, 08:50 | |
22.10.2012, 08:50 | |
Помогаю со студенческими работами здесь
28
Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf? Что обозначает строка вида sizeof(data)/sizeof(data[0])? Marshal.SizeOf и sizeof Задача на битовую магию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |