Здравствуйте, Erop, Вы писали:
Pzz>>"Использовать" это оговорка? Имелось ввиду, инлайнить? E>А что обозначает слово "инлийнить"? Вообще-то компилятор не обязан именно подставлять. Он просто может использовать для оптимизации определение функции. Есть много путей это сделать вообще-то.
Вы что сказать-то хотите?
Pzz>>Это все не так просто, на самом деле. Например, если описать функцию в ашнике, и использовать этот ашник из нескольких разных модулей, указатель на функцию будет один и тот же. Статические переменные инлайновой функции будут одни и те же. Это требует довольно нетривиальной поддержки в линкере.
E>Во-первых это таки проблемы линкера, но они невелики E>Во-вторых что тут умного? Ну заводишь сегмент данных который называется "статическая переменная из такой-то функции" и всюду ссылаешься на него.
У Вас появляется ситуация, когда один и тот же символ определен во многих модулях. Линкер должен понять, что это не ошибка, убедиться, что это и впрямь один и тот же символ, и слить все инкарнации в одну при формировании образа программы.
Такой интеллект в линкере появился только вместе с C++, раньше этого не было.
Кстати, ситуация становится еще интереснее, если разные части программы собирались разными компиляторами, но с одними и теми же .h-файлами, и инлайновыми функциями, в них определенными. Или, допустим, если инлайновая функция используется и в программе, и в DLL, т.е. в разных единицах компоновки. Кстати, насколько я понимаю, ни один из существующих тулчейнов не умеет разруливать такие хитрые случаи корректно.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Roman Odaisky, Вы писали:
RO>>2. Битовые поля с членами знаковых типов — абсолютное зло. E>ИМХО Гитлер всё-таки был хуже
E>Но в целом я согласен, что bitfields лучше избегать. Просто потому, что так проще.
Да вы просто не умеете их готовить...
bitfields нужны только в тех случаях, когда нужно запарсить какой-то int или short или даже char.
Например выставить какие-то флажки в регистрах аппаратуры или иногда в базе данных.
Здравствуйте, andrey-S, Вы писали:
AS>Да вы просто не умеете их готовить... AS>bitfields нужны только в тех случаях, когда нужно запарсить какой-то int или short или даже char. AS>Например выставить какие-то флажки в регистрах аппаратуры или иногда в базе данных.
Ну это пока ты не захотел переносимости на другой компилятор...
Вообще-то я не понимаю, что мешает написать переносимое и последовательное C++ средство доступа к битовому полю...
Хотя и через bf эта проблема решается более или менее приемлемо.
Так что если у тебя это только в одном месте, то я бы может и оставил бы bf, или через маски написал бы.
Если местах в пяти, то я бы, конечно написал какой-нибудь способ порождать геттеры и сеттеры.
E>>Есть ещё один забабах -- это когда ты так как-то пишешь:
enum MyEnum { zero, one, two, three };
AS>В bitfields все поля обязательно должны быть unsigned. Иначе могут быть бааальшие проблемы при проверках типа: mode.dw.NofPulses == 6
Когда речь идёт о enums, то у тебя обычно нет возможности навязать компилятору беззнаковость...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, andrey-S, Вы писали:
AS>Да вы просто не умеете их готовить... AS>bitfields нужны только в тех случаях, когда нужно запарсить какой-то int или short или даже char. AS>Например выставить какие-то флажки в регистрах аппаратуры или иногда в базе данных.
Да, это все правда. Но только при двух условиях:
1) переносимость не нужна;
2) скорость не интересует.
Здравствуйте, Erop, Вы писали:
AS>>bitfields нужны только в тех случаях, когда нужно запарсить какой-то int или short или даже char. AS>>Например выставить какие-то флажки в регистрах аппаратуры или иногда в базе данных.
E>Ну это пока ты не захотел переносимости на другой компилятор...
Если разрядность процессора не меняется, то никакой непереносимости вроде нет. Да и тогда эта проблема разрешима.
Формат получается одинаковый и в С, и в С++ в MSVC, Builder-6 и в мVision.
Под другим компилятором наверное понимается другой язык программирования? Или я чего-то не понял.
E>Вообще-то я не понимаю, что мешает написать переносимое и последовательное C++ средство доступа к битовому полю... E>Хотя и через bf эта проблема решается более или менее приемлемо. E>Так что если у тебя это только в одном месте, то я бы может и оставил бы bf, или через маски написал бы. E>Если местах в пяти, то я бы, конечно написал какой-нибудь способ порождать геттеры и сеттеры.
Как правило работа с аппаратурой реализуется в одном проекте и компилится одним компилятором.
В этом случае битовое поле довольно удобное средство поскольку:
1) для создания и поддержки разных форматов требуется гораздо меньше усилий
(например написание и поддержка методов get и set например для 20-40 разных форматов — довольно трудоёмко)
2) нельзя по ошибке выставить "левый" разряд в битовом поле перепутав его название,
чего не скажешь про маски. Они работают по принципу все со всеми.
3) часто запись с использованием битового поля короче и нагляднее чем через маски:
Впрочем я предпочитаю комбинацию bitfield и масок:
bitfield — если надо установить одно поле,
маска — если надо установить сразу несколько полей, а форматы уже утряслись
Если требуется платформонезависимый экспорт, можно создать это средство.
Но в реализации его также часто удобно использовать bitfields.
E>>>Есть ещё один забабах -- это когда ты так как-то пишешь:
enum MyEnum { zero, one, two, three };
AS>>В bitfields все поля обязательно должны быть unsigned. Иначе могут быть бааальшие проблемы при проверках типа: mode.dw.NofPulses == 6 E>Когда речь идёт о enums, то у тебя обычно нет возможности навязать компилятору беззнаковость...
Потому надо взять за правило: не использовать enum в bitfields.
Здравствуйте, elcste, Вы писали:
AS>>Да вы просто не умеете их готовить... AS>>bitfields нужны только в тех случаях, когда нужно запарсить какой-то int или short или даже char. AS>>Например выставить какие-то флажки в регистрах аппаратуры или иногда в базе данных.
E>Да, это все правда. Но только при двух условиях:
E>1) переносимость не нужна; E>2) скорость не интересует.
Здравствуйте, elcste, Вы писали:
E>>>2) скорость не интересует. AS>>Про скорость не понял . Можете пояснить?
E>Попробуйте написать разбор/создание какого-нибудь битстрима на bit-fields и посмотрите, какой код Вам сгенерировал Ваш компилятор.
Согласен . В обычной практики для экономии места использовать bit-fields не стоит.
Я лишь хочу отметить, что bit-fields довольно удобны, если надо запарсить или распарсить какой-нибудь int.