펑터가 실제로 함수에 대한 포인터보다 빠릅니까?
Scott Meyers에 따르면 C ++가 C보다 빛나는 영역 중 하나는 함수 개체가 함수 포인터보다 빠르다는 것입니다. 그는 이것은 함수 객체가 인라인되어 속도가 증가하기 때문이라고 말합니다.
이에 대해 두 가지 질문이 있습니다.
실제로 함수 객체가 인라인되었는지 어떻게 확인할 수 있습니까? 실제로 이것을 확인할 수 있습니까?
함수 객체의 인라인은 우리가 사용하는 컴파일러에 의존합니까, 아니면 모든 컴파일러가 이와 같이 작동합니까?
C ++ 및 C 표준은 컴파일러에게 많은 자유를 제공합니다. 컴파일러는 모든 명령어 사이에서 10 억까지 자유롭게 계산할 수 있으며 정수에 소수가있는 경우에만 계산할 수 있습니다.
괜찮은 "진짜"컴파일러는 이것을하지 않습니다. 이것은 구현 품질 문제입니다.
함수 객체를 다음과 같이 인라인 std::sort
하는 것은 모든 실제 컴파일러가하는 일입니다. 유형 정보가 인라인되어야하는 코드와 함께 전달되기 때문에 이러한 경우에 인라인되어야하는 항목을 감지하는 것은 매우 쉽습니다.
함수 포인터로 그렇게하는 것은 더 어렵습니다. 모든 것이 변환 된 함수 포인터 void*
나 char*
포인터로 그렇게하는 것은 훨씬 더 어렵습니다.
이것의 효과는 해당, 실제로는, C 스타일의 호출이다 qsort
는 C ++ 대 -에 스타일의 호출 std::sort
에 대한 큰 장점이 될 수 있습니다 std::sort
.
qsort
무작위로 배열 된 정수를 정렬하는 엄청나게 간단한 상황에서 여기 에 std::sort
표시된 것처럼는 약 2 배 느립니다 .
실제 어셈블리 코드 출력을 검사하는 것은 주로 세부 사항이며 거의 반환하지 않는 작업이 많습니다. 구체적인 실제 사례를 통해 실제로 얼마나 큰 영향을 미치는지 알 수 있습니다.
그 소리, GCC 및 MSVC 경우 수의 모든 3 만들려면 std::sort
빨리 자신보다 훨씬 수 qsort
. 그리고 이것은 쉬운 최적화이지만 함수 포인터를 인라인 호출로 최적화하는 것은 그렇지 않기 때문에 덜 주요 컴파일러가 qsort
.
- 함수 객체가 실제로 인라인되었는지 어떻게 확인할 수 있습니까? 실제로 이것을 확인할 수 있습니까?
물론, 마지막으로 내 보낸 어셈블러 코드를 검사하십시오.
- 인라인 함수 객체는 우리가 사용하는 컴파일러에 따라 달라집니다. 아니면 모든 컴파일러가 그렇게 동작합니까?
컴파일러 구현 및 사용되는 최적화 수준에 크게 의존합니다.
따라서 특정 컴파일러 (링커)가 그렇게 작동한다는 보장은 없습니다.
함수 포인터를 통한 호출은 인라인 될 수 없습니다.
그에 따르면 기능 개체가 인라인되어 속도가 증가합니다.
IMO "함수 객체가 인라인 됨" 은 더 잘 읽어야합니다 (또는 그 인용이 어디에서 왔는지 모르겠습니다).
함수 객체 는 인라인 될 수 있지만 함수 포인터를 통한 호출은 불가능합니다.
예, 함수 객체는 더 빠른 코드로 이어질 수 있습니다. 그러나이를 보장하는 유일한 방법은 벤치마킹입니다.
문서는 말한다 : " GCC는 여전히 여러 가지 이유로 함수를 인라인하지 못할 수 있습니다하며
-Winline
왜 함수가 인라인 및되지 않은 경우 옵션을 결정하는 데 이용 될 수있다. "물론 컴파일러, 버전, 플래그 등에 따라 달라집니다. 때때로 인라인은 비생산적 일 수 있습니다 (코드 부풀림 등). 따라서 각 컴파일러에는 함수를 인라인해야하는지 여부를 결정하는 자체 규칙 세트가 있습니다. 그건 그렇고,
inline
키워드는 힌트 일뿐이며 eigen 과 같은 일부 라이브러리 는 인라인을 적용하기가 어렵습니다.
참고 URL : https://stackoverflow.com/questions/40809985/are-functors-actually-faster-than-pointers-to-functions
'programing' 카테고리의 다른 글
AngularJS POST 실패 : 프리 플라이트에 대한 응답에 잘못된 HTTP 상태 코드 404가 있습니다. (0) | 2020.12.12 |
---|---|
NOT LIKE 및 LIKE가 반대 결과를 반환하지 않음 (0) | 2020.12.12 |
원사로 글로벌 패키지를 설치하는 방법 (0) | 2020.12.12 |
applicationContext를 여러 파일로 분할 (0) | 2020.12.12 |
Django 관리 인터페이스에서 하이퍼 링크가있는 사용자 지정 열을 추가하려면 어떻게합니까? (0) | 2020.12.12 |