Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: int t:1 -- Что это?  (Прочитано 16813 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« : 08-05-2007 07:37 » 

Добрый день.

Вот встретилось следующее:

Код:
class MyClass
{
  public:
     void SomeFun();
 
  public:
   int flag :1;
 }

Что значит строчка:
Код:
int flag :1;

Битовое поле?
Зачем так определять? Есть ли выигрыш по сравнению с просто
Код:
int flag;

Или это НЕ битовое поле?
« Последнее редактирование: 08-05-2007 07:42 от Артем » Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #1 : 08-05-2007 10:13 » 

да это битовое поле. Выигрыш или проигрыш по скорости - зависит от компилятора, но в общем случае это проигрыш. Битовыми полями пользуюсь только если надо прочесть какую то структуру из файла/памяти... чтобы отдельно каждый элемент структуры не заполнять значениями проще просто грузить в структуру определённую битовыми полями
« Последнее редактирование: 08-05-2007 10:18 от Tuborg » Записан
Vlaor
Гость
« Ответ #2 : 08-05-2007 12:37 » 

Может писалось по шаблону, и приплыло Улыбаюсь
Или как резерв на будущее.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 08-05-2007 13:19 » 

Ребятки, вы просто "никогда" не работали с битовыми процессорами (читай битовыми командами)
ну, нет в х86 битовых команд (флаги я исключаю).
а, например в х51 такого добра - милости прошу. И компилятор прекрасно понимает, что надо работать с битом.
например, делаешь глобальный цикл, но в каждом втором нужно что-то сделать еще...
или проанализировать только один пин.

Выигрыш на х86 - только в понимании логики программы.
Но! конечно назвать флаг флагом мало, а че в облом было написать флаг_переполнения_сумматора Не понял
тогда бы, наверное,  и все вопросы отпали Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 08-05-2007 17:04 » 

У нас на работе используют штуку структурках флагов
struct bin_flags
{
 int eof:1;
 int good:1;
}
затем это дело засовываем в
union state
{
 bit_flags bflags;
 int flags;
}

собственно зачем?
затем что в один int засовываем до 32-х флагов
типа место экономим Улыбаюсь
а в юнион пихаем что бы структурку было проще копировать Улыбаюсь
и размер POD структуры менятся не будет до тех пор пока все биты в int не выберем

кстати лучше заменить int i:1; на unsigned int i:1;
в первом случае у тебя в i могут быть только 0 и -1 во втором 0 и 1
сам исправлял баги когда флаг int i:1; сравнивали с 1 и нефига не работало.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 08-05-2007 17:16 » 

LogRus,

а я сразу так делаю ) :

union state
{
  struct
  {
    int eof:1;
    int good:1;
  }
  int flags;
}
Записан

Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #6 : 09-05-2007 09:20 » 

 Спасибо всем за ответы.

Я тоже считал что использовани битовых поле необходимо либо для экономии места
один int засовываем до 32-х флагов
либо

если надо прочесть какую то структуру из файла/памяти...

Но в данном примере под этот "flag" все равно выделится 4 байта, а времени может занять больше из-за обрашения как к битовому полю. ИМХО.

Просто это мне встретилось в "очень солидном" коде, вот я и смутился. Здесь была моя ладья...

Еще раз спасибо, что развеяли мои сомнения  Улыбаюсь
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #7 : 10-05-2007 10:15 » 

Вопрос из той же серии:

Код:
int fun (int* a)
{
  (void) a;
  int b = (*a);
  return b;
}

Что за мегасмысл скрыт в строчке "(void) a;" ?
« Последнее редактирование: 10-05-2007 10:17 от Артем » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 10-05-2007 10:28 » new

LogRus,

а я сразу так делаю ) :

union state
{
  struct
  {
    int eof:1;
    int good:1;
  }
  int flags;
}

Вспонил, в чем проблема в твоём коде, его нельзя было нормально использовать в gcc.

Артем, я смысла не вижу.
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 10-05-2007 11:09 » 

Я тоже не вижу смысла. Даже если это работает - в а лежит мусор. А потом этот мусор используется в качестве адреса. Может запрограммированная ошибка доступа? Ну мало ли? Может кому захотелось пользователей подоставать? При определённых действиях.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #10 : 10-05-2007 12:17 » 

Даже если это работает - в а лежит мусор.

ПОЧЕМУ  Здесь была моя ладья... Разве в а не лежит, то что положили при вызове функции?

например:

Код:
main()
{
  int test = 10;
  int b;
  b = fun (&test);

}

разве b не равно 10 Не понял
« Последнее редактирование: 10-05-2007 12:20 от Артем » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 10-05-2007 13:14 » 

Аааа сори. Каюсь. Я не обратил внимание, что а ещё и передаётся в качестве параметра. Видел только тело ф-ции. Я думал рамки ф-ции так, для полноты примера. А так это просто вызов оператора кастинга в void.

Ну тогда всё в порядке. Земля снова круглая. Ага

Предположение - откуда такие вещи берутся. Это атавизмы кода. Недавно у себя на нечто подобное напоролся. Проследил всю историю. Короче ф-я абсолютно абсурдная в одном месте вызывалась. Надо было просто апдейтнуть корешки Таба - текст. И вдруг откуда не возьмись ещё ф-я установки цвета этих корешков. Так что при апдейте они ещё вдруг и цвет меняют. Причём файл не трогали несколько месяцев, потом вдруг в один день (два года назад) добавили в него эту ф-ю и потом снова не трогали. Те случайность исключена. Самым логичным представляется допущение, что с кодом просто экспериментировали и не всё удалили - обычно перед check-in мы проверяем только компиляспособность, а с этим было всё в порядке.

Так и тут. Кто-то что-то попробовал, компилиться ну и ладно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #12 : 10-05-2007 13:53 » 

Действительно похоже на
Это атавизмы кода.

Вот только слишком уж часто подобные строки встречаются, вот я и заволновался: вдруг чего не понимаю  Быть такого не может
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 10-05-2007 14:02 » 

ну я думаю это зависит от того насколько интенсивно с этим кодом работали и как часто программера отвлекали во время работы. И потом, это было только моё предположение.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines