Как реализован getchar ()? - PullRequest
2 голосов
/ 03 марта 2012

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

Псевдокод:

int getchar() {

    char buf[1];
    int n = read(0, buf, 1);

    if(n < 1)
        printf("Read failed");

    return buf[0];
}

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

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

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

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

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

1 голос
/ 09 октября 2015

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

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;
}
...