2017-10-24 6 views
-1

http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.htmlhttp://www.geeksforgeeks.org/c-qsort-vs-c-sort/에서 STL의 정렬 메커니즘을 사용하면 C의 qsort()보다 빠릅니다.C++ 연산자는 언제 실제로 인라인됩니까?

비교 기능이 "인라인 됨"때문입니다. 그러나 컴파일러 탐색기를 https://godbolt.org/에서 gcc 컴파일러의 출력을 검사 할 때 실제로 인라인 될 연산자를 얻을 수 없습니다. 예제 here를 참조 코드는 다음과 같다 :

#include <string> 
#include <algorithm> 
#include <vector> 
#include <cstdlib> 
#include <iostream> 

using namespace std; 

class myClass { 
    public: 

    int key; 
    int data; 

    myClass(int k, int d) : key(k), data(d) {} 

    inline bool operator<(myClass& other) { 
     return key < other.key; 
    } 
}; 

main() { 
    myClass c1(1,100), c2(2, 100); 
    if (c1 < c2) cout << "True" << endl; 
    else cout << "False" << endl; 
} 

생성 된 어셈블리 코드는 명확하게 operator< 루틴 호출합니다. C++ 컴파일러는 inline 키워드를 완전히 무시했습니다!

정확히 일 때 연산자가 인라인됩니까? 이것은 예를 들어 더 빠른 정렬 성능을 갖는 열쇠이지만 가능할 때마다이를 활용하는 방법을 알고 있으면 좋을 것입니다.

+2

최적화를 사용 하시겠습니까? – Galik

+0

아, 와우, 그게 전부 였다고 믿을 수가 없어. – Mahkoe

+1

주 :'inline'은 클래스 몸체 안의 멤버 함수 _defined_에 대해 중복된다. 자동으로 '인라인'됩니다. –

답변

4

대부분의 컴파일러는 디버깅 방법으로 인해 기본적으로 아무 것도 인라인하지 않습니다. 최적화를 활성화해야합니다.

gcc는 levels of optimizations과 개별 조정할 수있는 최적화 설정이 많지만 가장 간단한 "-O1" flag is enough이라도 operator< 함수를 인라인하게 만듭니다. 실제로 gcc는 컴파일시 operator<의 결과를 확인할 수 있었고 else 분기를 완전히 삭제할 수 있음을 깨달았습니다.