W „Advanced Programming in the UNIX Environment” W. Richard Stevens mówi, że jest to optymalizacja wydajności:
Określając najwyższy interesujący nas deskryptor, jądro może uniknąć przejścia setek nieużywanych bitów w trzech zestawach deskryptorów, szukając włączonych bitów.
(1. wydanie, strona 399)
Jeśli wykonujesz programowanie w systemach UNIX, książka APUE jest wysoce zalecana.
AKTUALIZACJA
fd_set
Zazwyczaj jest w stanie śledzić do 1024 deskryptorów.
Najbardziej efektywnym sposobem śledzenia, które fds
są ustawione 0
i które są ustawione, 1
byłby zestaw bitów, więc każdy fd_set
składałby się z 1024 bitów.
W systemie 32-bitowym długie int (lub „słowo”) ma 32 bity, co oznacza, że każde fd_set
ma
1024/32 = 32 słowa.
Jeśli nfds
jest coś małego, takiego jak 8 lub 16, co byłoby w wielu aplikacjach, wystarczy zajrzeć do pierwszego słowa, które powinno być wyraźnie szybsze niż zajrzenie do wszystkich 32.
(Zobacz FD_SETSIZE
i __NFDBITS
od /usr/include/sys/select.h
wartości na twojej platformie.)
AKTUALIZACJA 2
Co do tego, dlaczego podpis funkcji nie jest
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Sądzę, że to dlatego, że kod próbuje zachować wszystkie argumenty w rejestrach , więc procesor może na nich pracować szybciej, a jeśli musiałby śledzić dodatkowe 2 zmienne, procesor może nie mieć wystarczającej liczby rejestrów.
Innymi słowy, select
ujawnia szczegół implementacji, aby mógł być szybszy.