2016-10-09 4 views
3

Ich habe eine Frage zur Leistung. Ich denke, das gilt auch für andere Sprachen (nicht nur C++).C++ Return Performance

Stellen Sie sich vor, dass ich diese Funktion:

int addNumber(int a, int b){ 
    int result = a + b; 
    return result; 
} 

Gibt es eine Performance-Verbesserung, wenn ich den Code oben so schreiben?

Ich habe diese Frage, weil die zweite Funktion keine dritte Variable deklariert. Aber würde der Compiler dies im ersten Code erkennen?

+0

Es auf Ihrem Compiler abhängig ist, und innerhalb des Compilers, seine Optimierungseinstellungen. Trotzdem passt es sehr gut zur Optimierung - wahrscheinlich wird es sogar stillschweigend durch eine Inline-Berechnung ersetzt. – usr2564301

+3

Die meisten Compiler generieren für beide Funktionen genau dieselbe Assembly, wenn Optimierungen aktiviert sind. –

+1

Sie können es kompilieren, sehen Sie sich die resultierende Baugruppe an und sehen Sie selbst. –

Antwort

8

Um diese Frage zu beantworten, können Sie look at the generated assembler code. Mit -O2 erzeugt 6,2 x86-64 gcc genau den gleichen Code für beide Methoden:

addNumber(int, int): 
    lea  eax, [rdi+rsi] 
    ret 
addNumber2(int, int): 
    lea  eax, [rdi+rsi] 
    ret 

Nur ohne Optimierung eingeschaltet, there is a difference:

addNumber(int, int): 
    push rbp 
    mov  rbp, rsp 
    mov  DWORD PTR [rbp-20], edi 
    mov  DWORD PTR [rbp-24], esi 
    mov  edx, DWORD PTR [rbp-20] 
    mov  eax, DWORD PTR [rbp-24] 
    add  eax, edx 
    mov  DWORD PTR [rbp-4], eax 
    mov  eax, DWORD PTR [rbp-4] 
    pop  rbp 
    ret 
addNumber2(int, int): 
    push rbp 
    mov  rbp, rsp 
    mov  DWORD PTR [rbp-4], edi 
    mov  DWORD PTR [rbp-8], esi 
    mov  edx, DWORD PTR [rbp-4] 
    mov  eax, DWORD PTR [rbp-8] 
    add  eax, edx 
    pop  rbp 
    ret 

jedoch Performance-Vergleich ohne Optimierung bedeutungslos

ist
2

Im Prinzip gibt es keinen Unterschied zwischen den beiden Ansätzen. Die meisten Compiler haben diese Art der Optimierung seit einigen Jahrzehnten durchgeführt.

Zusätzlich, wenn die Funktion inlined sein kann (zB ist ihre Definition für den Compiler beim Kompilieren von Code sichtbar, der eine solche Funktion verwendet), wird die Mehrheit der Compiler die Funktion komplett eliminieren und einfach Code ausgeben, um die zwei übergebenen Variablen hinzuzufügen und speichern Sie das Ergebnis wie vom Aufrufer gefordert.

Offensichtlich gehen die obigen Kommentare davon aus, dass sie mit einer relevanten Optimierungseinstellung kompiliert werden (z. B. kein Debug-Build ohne Optimierung).

Ich persönlich würde eine solche Funktion sowieso nicht schreiben. Es ist einfacher, in dem Anrufer c = a + b anstelle von c = addNumber(a, b) zu schreiben, so dass eine Funktion wie diese keinen Vorteil für Programmierer (Anstrengung zu verstehen) oder Programm (Leistung usw.) bietet. Sie können auch Kommentare schreiben, die keine nützlichen Informationen enthalten.

c = a + b; // add a and b and store into c 

Ein anständiger Code Rezensent würde bitter über uninformativ Funktionen oder uninformativ Kommentare beschweren.

Ich würde nur verwenden, eine solche Funktion, wenn ihr Name eine besondere Bedeutung befördert (dh mehr als nur zwei Werte addiert) für die Anwendung

c = FunkyOperation(a,b); 

int FunkyOperation(int a, int b) 
{ 
    /* Many useful ways of implementing this operation. 
      One of those ways happens to be addition, but we need to 
      go through 25 pages of obscure mathematical proof to 
      realise that 
    */ 

    return a + b; 
}