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_setZazwyczaj jest w stanie śledzić do 1024 deskryptorów.
Najbardziej efektywnym sposobem śledzenia, które fdssą ustawione 0i które są ustawione, 1byłby zestaw bitów, więc każdy fd_setskł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_setma
1024/32 = 32 słowa.
Jeśli nfdsjest 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_SETSIZEi __NFDBITSod /usr/include/sys/select.hwartoś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, selectujawnia szczegół implementacji, aby mógł być szybszy.