it-source

getc() vs fgetc() - 주요 차이점은 무엇입니까?

criticalcode 2022. 12. 29. 20:31
반응형

getc() vs fgetc() - 주요 차이점은 무엇입니까?

'거의 똑같다' 이런 걸 보면...

GNU C 프로그래밍 튜토리얼에서:

GNU C 라이브러리에는 fgetc라는 다른 함수가 있습니다.getc는 일반적으로 매크로 함수로 구현되고 고도로 최적화되므로 대부분의 상황에서 선호된다는 점을 제외하고는 대부분의 점에서 getc와 동일합니다.(표준 입력에서 읽는 상황에서는 getc가 fgetc만큼 빠릅니다.컴퓨터가 입력 내용을 읽을 수 있는 속도에 비해 사람이 입력하는 속도가 느리지만, 사람이 인터랙티브하게 작성하지 않은 스트림에서 읽을 때는 fgetc가 더 나을 수 있습니다.)

다른 차이점은 무엇입니까?각각 다른 실장(매크로로서 사용할 수 있는 것)을 가지고 있다고 들었습니다만, 표준 C 라이브러리(또는 사양)에 있는 것은 무엇이 다른 것일까요?

에서Advanced Programming in Unix Environment:

...

의 차이점getc그리고.fgetc그것이다getc매크로로서 실장할 수 있습니다만,fgetc매크로로 구현할 수 없습니다.이것은, 다음의 3가지를 의미합니다.

  • 에 대한 의론getc부작용이 있는 표현이 되어서는 안 됩니다.
  • 부터fgetc함수가 되는 것을 보증합니다.주소를 취득할 수 있습니다.이를 통해 다음 주소를 전달할 수 있습니다.fgetc다른 함수에 대한 인수입니다.
  • fgetc에 대한 콜은 에 대한 콜보다 시간이 오래 걸릴 수 있습니다.getc일반적으로 함수를 호출하는 데 시간이 더 걸리기 때문입니다.

...

99.9%의 경우 차이가 무의미해 보입니다.

차이를 만들 수 있는 한 가지 포인트 - man 페이지에는 다음과 같은 내용이 있습니다.getc() may be implemented as a macro which evaluates stream more than once.

다음과 같은 경우에 이상한 동작을 일으킬 수 있습니다(매우 유용하지 않은 경우).

FILE *my_files[10] = {...}, *f=&my_files[0];
for (i=0; i<10; i++) {
    int c = getc(f++);    // Parameter to getc has side effects!
}

한다면getc평가하다f++몇 번이고, 그것은 진보할 것이다f1회 이상 반복할 수 있습니다.그에 비해fgetc그런 상황에서는 안전합니다.

기본적으로 같은 것(또는 귀찮지 않을 정도로 유사)이 있습니다. 실장을 살펴봐야 합니다.GNU libcMUSL libc는 무료 소프트웨어 실장입니다.또, 인라인 기능으로서 실장할 수 있게 되었습니다(매크로와 같은 고속).

그리고 난 그렇게 많이 괴롭히진 않을 거야.실제로 I/O는 대부분 하드웨어(디스크에 액세스하는 시간 등)에 의해 제약을 받습니다.

언급URL : https://stackoverflow.com/questions/18480982/getc-vs-fgetc-what-are-the-major-differences

반응형