2017-08-19 4 views
3

Windows-Ziel Projekt, Visual Studio 2012std :: sort & comp - Aufrufkonvention?

Ich versuche std::sort zu verwenden, um ein Array von struct Zeigern zu sortieren. Die Sortierung soll aus einer GUID erfolgen, die in der Struktur enthalten ist, und deshalb möchte ich eine benutzerdefinierte Vergleichsfunktion für meinen Sortieraufruf definieren.

std::sort(
    std::begin(pUnits), 
    std::end(pUnits), 
    MyCustomSortFunctionHere 
); 

Jetzt ist meine Frage, was ist die erwartete Aufrufkonvention für die bereitgestellte Vergleichsfunktion? Frage könnte eher sein, macht die Calling Convention hier überhaupt einen Unterschied?

Grund muss ich wissen ist, meine Projekteinstellungen spielen mit den Standard-Aufrufkonventionen und so, wenn ich meine Vergleichsfunktion deklariere, ohne explizit die Aufrufkonvention zu deklarieren, frage ich mich, ob es brechen würde. Ich kann nirgendwo Informationen darüber finden.

Danke.

+8

Ich bin ziemlich sicher, dass 'std :: sort' sich nicht um die Aufrufkonvention von' MyCustomSortFunctionHere' kümmert. Es ist eine Vorlage, es braucht alles, auf das ein Funktionsaufrufoperator angewendet werden kann. –

+1

Einige Beispiele sind hier http://en.cppreference.com/w/cpp/algorithm/sort –

+0

@HariomSingh diejenigen, die keine Aufrufkonvention definieren, das ist der Kernpunkt meiner Frage – Verv

Antwort

4

Meine Argumentation ist, dass MyCustomSortFunctionHere Funktion (oder Klassenmethoden?) Mit der Aufrufkonvention aufgerufen wird man es zu fragen: mit

extern "C" bool MyCustomSortFunctionHere(Unit const*, Unit const*); 

es mit „C“ Aufrufkonvention genannt werden würde. Da std::sort() eine Vorlagenfunktion ist, wird sie zusammen mit Ihrem Code in derselben Übersetzungseinheit erstellt, einschließlich des Teils, in dem Ihre Vergleichsfunktion aufgerufen wird, und der Aufruf an MyCustomSortFunctionHere folgt den Regeln, die Sie in dieser Übersetzungseinheit angegeben haben.

Wenn Sie die Vergleichsfunktion in derselben Übersetzungseinheit definieren, sollten Sie keine Konvention angeben. Wenn die Funktion stattdessen in einer anderen Übersetzungseinheit definiert ist, müssten Sie dem Compiler die richtige Aufrufkonvention ausdrücken.

0

Wie wird Ihre MyCustomSortFunctionHere implementiert?
a. mit Funktor oder,
b. mit der Methode Unterschrift Bool cmp (const Typ1 & a, const Typ2 & b)

Bei ersten Methode wird als „Thiscall“ Aufrufkonvention und im Falle der zweiten Methode verwendet __cdecl verwendete Konvention aufruft. Ich verifizierte die oben genannten mit der Demontage des Codes von Visual Studio Compiler für jede der oben genannten Methoden generiert.

Hoffe, das hilft!