In "Advanced Programming in the UNIX Environment" , W. Richard Stevens afferma che si tratta di un'ottimizzazione delle prestazioni:
Specificando il descrittore più alto a cui siamo interessati, il kernel può evitare di passare attraverso centinaia di bit inutilizzati nei tre set di descrittori, cercando i bit che sono attivati.
(1a edizione, pagina 399)
Se stai eseguendo qualsiasi tipo di programmazione di sistemi UNIX, il libro APUE è altamente raccomandato.
AGGIORNARE
Di fd_set
solito è in grado di tracciare fino a 1024 descrittori di file.
Il modo più efficiente per tenere traccia di quali fds
sono impostati 0
e su cui è impostato 1
sarebbe un bitset, quindi ciascuno fd_set
consisterebbe in 1024 bit.
Su un sistema a 32 bit, un int lungo (o "parola") è 32 bit, quindi ciò significa che ciascuno fd_set
è
1024/32 = 32 parole.
Se nfds
è qualcosa di piccolo, come 8 o 16, che sarebbe in molte applicazioni, deve solo guardare dentro la prima parola, che dovrebbe essere chiaramente più veloce di guardare dentro tutti e 32.
(Vedi FD_SETSIZE
e __NFDBITS
da /usr/include/sys/select.h
per i valori sulla tua piattaforma.)
AGGIORNAMENTO 2
Sul motivo per cui la firma della funzione non lo è
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
La mia ipotesi è che il codice tenti di mantenere tutti gli argomenti nei registri , in modo che la CPU possa lavorare su di essi più velocemente e se dovesse tenere traccia di altre 2 variabili, la CPU potrebbe non avere abbastanza registri.
Quindi, in altre parole, select
sta esponendo un dettaglio di implementazione in modo che possa essere più veloce.