У "Розширеному програмуванні в середовищі UNIX" У. Річард Стівенс каже, що це оптимізація продуктивності:
Вказавши найвищий дескриптор, який нас цікавить, ядро може уникнути перегляду сотні невикористаних бітів у трьох наборах дескрипторів, шукаючи біти, які увімкнено.
(1-е видання, стор. 399)
Якщо ви виконуєте будь-який тип програмування UNIX систем, книга APUE настійно рекомендується.
ОНОВЛЕННЯ
fd_set
, Як правило , в змозі відслідковувати до 1024 дескрипторів файлів.
Найефективнішим способом відстеження, для якого fds
встановлено, 0
а для якого встановлено, був 1
би біт, тому кожен fd_set
складався з 1024 біт.
У 32-розрядної системі довгий int (або "слово") становить 32 біти, тобто кожен fd_set
означає
1024/32 = 32 слова.
Якщо nfds
це щось невелике, наприклад 8 або 16, що було б у багатьох програмах, йому потрібно лише заглянути всередину 1-го слова, що явно повинно бути швидшим, ніж заглянути все 32.
(Див FD_SETSIZE
і __NFDBITS
з /usr/include/sys/select.h
для значень на вашій платформі.)
ОНОВЛЕННЯ 2
Щодо того, чому функція підпису відсутня
int select(fd_set *readfds, int nreadfds,
fd_set *writefds, int nwritefds,
fd_set *exceptfds, int nexceptfds,
struct timeval *timeout);
Думаю, це тому, що код намагається зберегти всі аргументи в регістрах , щоб процесор міг працювати над ними швидше, і якби йому довелося відслідковувати додаткові 2 змінні, процесор може не мати достатньої кількості регістрів.
Іншими словами, select
розкрийте деталі реалізації, щоб воно було швидше.