|
|
| Посл.отвђт | Сообщен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 |