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++
몇 번이고, 그것은 진보할 것이다f
1회 이상 반복할 수 있습니다.그에 비해fgetc
그런 상황에서는 안전합니다.
기본적으로 같은 것(또는 귀찮지 않을 정도로 유사)이 있습니다.그 실장을 살펴봐야 합니다.GNU libc와 MUSL libc는 무료 소프트웨어 실장입니다.또, 인라인 기능으로서 실장할 수 있게 되었습니다(매크로와 같은 고속).
그리고 난 그렇게 많이 괴롭히진 않을 거야.실제로 I/O는 대부분 하드웨어(디스크에 액세스하는 시간 등)에 의해 제약을 받습니다.
언급URL : https://stackoverflow.com/questions/18480982/getc-vs-fgetc-what-are-the-major-differences
'it-source' 카테고리의 다른 글
matplotlib 그림의 글꼴 크기를 변경하는 방법 (0) | 2022.12.29 |
---|---|
JAXBelement 객체를 인스턴스화하려면 어떻게 해야 하나요? (0) | 2022.12.29 |
C/C++ bool 타입은 type cast'에서 int로 설정했을 때 항상 0 또는 1로 보증됩니까? (0) | 2022.12.29 |
Larabel 5.5 ajax 콜 419(알 수 없는 상태) (0) | 2022.12.29 |
MySQL(MariaDB) 업데이트 트랜잭션에서 '영향을 받는 0행'이 반환되는 이유는 무엇입니까? (0) | 2022.12.29 |