programing

펑터가 실제로 함수에 대한 포인터보다 빠릅니까?

nasanasas 2020. 12. 12. 11:05
반응형

펑터가 실제로 함수에 대한 포인터보다 빠릅니까?


Scott Meyers에 따르면 C ++가 C보다 빛나는 영역 중 하나는 함수 개체가 함수 포인터보다 빠르다는 것입니다. 그는 이것은 함수 객체가 인라인되어 속도가 증가하기 때문이라고 말합니다.

이에 대해 두 가지 질문이 있습니다.

  1. 실제로 함수 객체가 인라인되었는지 어떻게 확인할 수 있습니까? 실제로 이것을 확인할 수 있습니까?

  2. 함수 객체의 인라인은 우리가 사용하는 컴파일러에 의존합니까, 아니면 모든 컴파일러가 이와 같이 작동합니까?


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.


  1. 함수 객체가 실제로 인라인되었는지 어떻게 확인할 수 있습니까? 실제로 이것을 확인할 수 있습니까?

물론, 마지막으로 내 보낸 어셈블러 코드를 검사하십시오.

  1. 인라인 함수 객체는 우리가 사용하는 컴파일러에 따라 달라집니다. 아니면 모든 컴파일러가 그렇게 동작합니까?

컴파일러 구현 및 사용되는 최적화 수준에 크게 의존합니다.
따라서 특정 컴파일러 (링커)가 그렇게 작동한다는 보장은 없습니다.

함수 포인터를 통한 호출은 인라인 될 수 없습니다.


그에 따르면 기능 개체가 인라인되어 속도가 증가합니다.

IMO "함수 객체가 인라인 됨" 은 더 잘 읽어야합니다 (또는 그 인용이 어디에서 왔는지 모르겠습니다).

함수 객체 는 인라인 될 수 있지만 함수 포인터를 통한 호출은 불가능합니다.


예, 함수 객체는 더 빠른 코드로 이어질 수 있습니다. 그러나이를 보장하는 유일한 방법은 벤치마킹입니다.

  1. 문서는 말한다 : " GCC는 여전히 여러 가지 이유로 함수를 인라인하지 못할 수 있습니다하며 -Winline왜 함수가 인라인 및되지 않은 경우 옵션을 결정하는 데 이용 될 수있다. "

  2. 물론 컴파일러, 버전, 플래그 등에 따라 달라집니다. 때때로 인라인은 비생산적 일 수 있습니다 (코드 부풀림 등). 따라서 각 컴파일러에는 함수를 인라인해야하는지 여부를 결정하는 자체 규칙 세트가 있습니다. 그건 그렇고, inline키워드는 힌트 일뿐이며 eigen 과 같은 일부 라이브러리 는 인라인을 적용하기가 어렵습니다.

참고 URL : https://stackoverflow.com/questions/40809985/are-functors-actually-faster-than-pointers-to-functions

반응형