Как реализуется getchar ()?

Мне просто интересно, как реализована функция getchar ()? Это что-то вроде следующего? Это довольно неэффективно, чтобы читать этот путь, один байт. Использует ли он некоторую буферизацию?

Pseudo code: int getchar(){ char buf[1]; int n = read(0,buf,1); if(n < 1) printf("Read failed"); return buf[0]; } 

Учитывая количество реализаций для стандартной библиотеки C, невозможно дать определенный ответ, но наиболее распространенные из них, похоже, следуют одним и тем же общим рекомендациям.

По определению, getchar() использует инфраструктуру streamа стандартной библиотеки C, т.е. FILE и ее дружественные функции. В большинстве современных реализаций библиотеки C streamи файлов буферизуются до некоторой степени, причем размер и поведение буфера обычно настраиваются через setvbuf() .

Я знаю, по крайней мере, один случай ( glibc ), где файлы могут быть необязательно – с помощью дополнительной опции fopen() – доступ к нему через сопоставление памяти (т.е. mmap() ), а не read() / write() . Чтобы избежать проблем при смешивании с вызовами функций более высокого уровня, таких как scanf() , getchar() вынужден использовать одни и те же структуры буферизации.

Без информации из профилировщика я бы больше беспокоился о структурной сложности любого кода, который использует getchar() чем о любых проблемах с производительностью, вызванных его использованием.

Вот очень простая реализация.

 int mygetchar(void) { static char buf[BUFSIZ]; static char *bufp = buf; static int i = 0; if (i == 0) { i = read(0, buf, 1); bufp = buf; } if ( --i >= 0 ) { return *bufp++; } return EOF; }