getchar()是如何实现的?

Fou*_*ind 5 c stdio

我只是想知道如何getchar()实施?是不是像下面这样?单字节这样读取效率相当低。它使用一些缓冲吗?

伪代码:

int getchar() {

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

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

    return buf[0];
}
Run Code Online (Sandbox Code Playgroud)

thk*_*ala 3

考虑到标准 C 库的实现数量,不可能提供明确的答案,但最常见的实现似乎遵循相同的一般准则。

根据定义,getchar()使用标准 C 库 ie 的流基础结构FILE及其友好的函数。在大多数现代 C 库实现中,文件流会进行一定程度的缓冲,缓冲区大小和行为通常可以通过setvbuf().

我知道至少一种情况(glibc),文件可以选择 - 通过额外的选项- 通过内存映射(即)而不是/fopen()进行访问。为了避免与调用更高级别的函数(例如 )混合时出现问题,被迫使用相同的缓冲结构。mmap()read()write()scanf()getchar()

如果没有来自探查器的信息,我会更担心使用的任何代码的结构复杂性,getchar()而不是由其使用引起的任何性能问题。