· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.BOOKS —› Голуб. "Веревка достаточной длины, чтобы… выстрелить себев ногу"

Посл.отвђт Сообщенiе


Дата: Сен 5, 2004 14:32:35 · Поправил: S_T_A_S_

85.2. Избегайте битовых масок; используйте битовые поля

Многие программисты, в особенности те, кто начинал жизнь с языком ассемблера, привыкли пользоваться битовыми масками, а не битовыми полями. Мне довелось видеть много программ, подобных следующей:
struct fred
{
   int status;
   // ...§
};

#define CONDITION_A    0x01
#define CONDITION_B    0x02
#define CONDITION_C    0x03

#define SET_CONDITION_A(p)    ((p)->status |= CONDITION_A)
#define SET_CONDITION_B(p)    ((p)->status |= CONDITION_B)
#define SET_CONDITION_C(p)    ((p)->status |= CONDITION_C)

#define CLEAR_CONDITION_A(p)  ((p)->status &= ~CONDITION_A)
#define CLEAR_CONDITION_B(p)  ((p)->status &= ~CONDITION_B)
#define CLEAR_CONDITION_C(p)  ((p)->status &= ~CONDITION_C)

#define IN_CONDITION_A(p)     ((p)->status & CONDITION_A)
#define IN_CONDITION_B(p)     ((p)->status & CONDITION_B)
#define IN_CONDITION_C(p)     ((p)->status & CONDITION_C)

#define POSSIBILITIES(x)      ((x) & 0x0030)
#define POSSIBILITY_A          0x0000
#define POSSIBILITY_B          0x0010
#define POSSIBILITY_C          0x0020
#define POSSIBILITY_D          0x0030

[......]

Лучшее решение использует битовые поля; они не требуют дополнительного места и заведомо эффективно реализуются на большинстве машин. [....]:
enum { possibility_a, possibility_b, possibility_b, possibility_d };

struct fred
{
    unsigned in_condition_a : 1;
    unsigned in_condition_b : 1;
    unsigned in_condition_c : 1;

    unsigned possibilities : 2;
};


Очевидно, что в первом варианте CONDITION_C хранится в тех же 2х битах что и CONDITION_A и CONDITION_B.
В случае с битовыми полями, под каждый condition выделяется независимый бит.

Эти 2 примера не равнозначны - в первом варианте CONDITION_C говорит о том, что выполняется одновременно CONDITION_A и CONDITION_B, во 2м - condition независимы друг от друга.

Возможно, имелось ввиду:
#define CONDITION_C 0x04

В слечае с POSSIBILITIES всё верно. (но это не флаги, а скорее попытка экономить место, логичнее (?) выделить для этого отдельный байт).


Дата: Сен 6, 2004 10:55:07

„Возможно, имелось ввиду:
#define CONDITION_C 0x04 “


Да, скорее всего. Когда я это читал, меня гораздо больше интересовала сама идея и ее реализация. Я даже, помнится, набросал маленький тест ради этого... и ужаснулся - по крайней мере MS VC 6 с битовыми полями работать не умеет. Не в том смылсе, что не поддерживает, а в том, что не оптимизирует.


Дата: Сен 6, 2004 18:42:15

Да, imho про „заведомо эффективно реализуются на большинстве машин“ замечание заметно более существенное, но есть одна проблема - его доказать.. против авторитета не попрёшь :).


Дата: Сен 6, 2004 18:53:43

Да нет... Голуб - мужик крутой, но сама книга предполагает жуткие споры. Так что, вы продолжайте. Я с очень большим интересом читаю :)


Дата: Сен 7, 2004 01:54:50

Это не тот мужик которого Надежда Григорьевна зовут?


Дата: Сен 7, 2004 03:16:06

:) Нет. Не тот :) Это Ален Голуб - Alen Holub.


Дата: Ноя 10, 2004 23:24:33

:) Я ещё подумал про Джин Голуб (Gene Golub) из Стандфорда.
Который с Ван Лоуном про матричные вычисления писал(а)? :)


Дата: Ноя 10, 2004 23:33:43

Прочитав книгу Голуба я понял две вещи:
1)Я не умею писать программы
2)Маловероятно что я когда-нибудь научусь писать программы


Дата: Ноя 11, 2004 09:42:58

а как точно книга называется ?


Дата: Ноя 11, 2004 21:25:21

Alen I. Holub.
"Enough Rope to Shoot Yourself in the Foot"


Дата: Ноя 11, 2004 22:52:08

в сети на русском этого добра как грязи..


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.131