efektywność zbiorów (set)

0

W mądrej książce, w rozdziale o typach danych w Delphi, przy uwagach dla programistów C/C++ przesiadających się na Delphi przeczytałem:

"W przeciwieństwie do masek bitowych, zbiory są na ogół łatwiejsze do odczytania"

Jak należy to rozumiec? Czy maski bitowe to ten typowy dla WinAPI sposób przekazywania danych np w PlaySound SND_ASYNC+SND_FILENAME? Dla kogo są łatwiejsze do odczytania - dla programisty czytającego kod, czy dla komputera??? Jaka jest wydajność zbiorów w porównaniu z maskami bitowymi?

0

Jeśli maski bitowe są zbudowane tak, że każda maska posiada tylko jeden bit ustawiony na 1, reszta na 0, oraz jeśli każda z masek ma inną wartość, w takim przypadku maska jest równoznaczna pod względem zapisu w pamięci do setu.

Łatwo to sprawdzić:

var
  s:set of (a, b, c, d, e, f, g, h, i);
begin
  s:=[a,c];
  Label1.Caption:='Rozmiar: '+inttostr(sizeof(s))+' ('+inttohex(word(s),4)+')';
end;

Rozmiar setu to 2 bajty, bo 9 obcji zajmuje 9 bitów (2 niepełne bajty), użycie elementu 1 oraz 3 daje wartość 5 (binarnie 101). Łatwiejszy jest może zapis przez dodawanie i usuwanie np.: s:=s+[b]; lub s:=s-[d], ale równie dobrze można by OR-ować lub AND-ować maski. Zaletą setów jest chyba to, że elementom automatycznie przypisywane są maski zależnie od kolejności wyszczególnienia. Ale z tego co wiem, skompilowana postać setu sprowadza się do maski bitowej.

(Tak, maski bitowe - choć lepszym jest stwierdzenie logiczne sumy bitowe to ta metoda wykorzystywana przy API).

0

Dzięki, czyli wydajność powinna być podobna?

0

Myślę, że powinna być podobna o ile w ogóle nie taka sama; ale to tylko moje przypuszczenia - nie popieram ich jakimiś testami czy wyliczeniami :D jak ktoś sprawdzi to dokładnie, niech tu dorzuci, chętnie zweryfikuję swą opinię.

0

Tylko np. dodanie/usunięcie elementu do/ze zbioru za pomocą funkcji Include()/Exclude() zajmuje tylko 1 instrukcję procesora. To takie małe uzupełnienie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1