2017-10-24 2 views
-1

Von http://cs.brown.edu/~jak/proglang/cpp/stltut/tut.html und http://www.geeksforgeeks.org/c-qsort-vs-c-sort/, finden wir, dass die Verwendung der STL-Sortiermechanismus ist schneller als C's qsort().Wann sind C++ Operatoren wirklich inline?

Dies liegt daran, dass die Vergleichsfunktion "inline" ist. Wenn ich jedoch den Compiler-Explorer unter https://godbolt.org/ verwende, um die Ausgabe des gcc-Compilers zu überprüfen, kann ich keine Operatoren dazu bringen, tatsächlich inline zu werden. Siehe here für ein Beispiel-Code unten angegeben:

#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; 
} 

Der erzeugte Assembler-Code macht deutlich einen Aufruf an die operator< Routine. Der C++ - Compiler hat das Schlüsselwort inline vollständig ignoriert!

Also, wenn genau sind die Betreiber inlined? Dies ist der Schlüssel zu einer schnelleren Sortierleistung, aber es wäre schön zu wissen, wie man es wann immer möglich ausnutzen kann.

+2

Haben Sie die Optimierung aktiviert? – Galik

+0

Oh wow, ich kann nicht glauben, dass das alles war – Mahkoe

+1

Hinweis: 'inline' ist redundant für Member-Funktionen _defined_ innerhalb eines Klassenkörpers; Sie werden automatisch inline erstellt. –

Antwort

4

Die meisten Compiler werden standardmäßig überhaupt nichts inline, da dies dem Debugging im Weg stehen kann. Sie müssen Optimierungen aktivieren.

gcc hat eine Handvoll von levels of optimizations und viele individuell einstellbare Optimierungseinstellungen, aber auch die einfachste "-O1" flag is enough, um Ihr Beispiel in die operator< Funktion zu inline zu verursachen. (Tatsächlich erkannte gcc tatsächlich, dass es das Ergebnis von operator< zur Kompilierzeit ermitteln konnte und den Zweig else vollständig verwerfen konnte!)

Verwandte Themen