2 Stimmen

Kann ein C/C++-Compiler eingebaute Funktionen wie malloc() inline schalten?

Beim Inspektion der Demontage der untenstehenden Funktion,

void * malloc_float_align(size_t n, unsigned int a, float *& dizi)
    {
        void * adres=NULL;
        void * adres2=NULL;
        adres=malloc(n*sizeof(float)+a);
        size_t adr=(size_t)adres;
        size_t adr2=adr+a-(adr&(a-1u));
        adres2=(void * ) adr2;
        dizi=(float *)adres2;
        return adres;
    }

Eingebaute Funktionen werden auch bei gesetzter inline-Optimierungsfahne nicht inlined.

; Linie 26
$LN4:
    push    rbx
    sub rsp, 32                 ; 00000020H
; Linie 29
    mov ecx, 160                ; 000000a0H
    mov rbx, r8
    call    QWORD PTR __imp_malloc <------dies ist nicht inlined
; Linie 31
    mov rcx, rax
; Linie 33
    mov rdx, rax
    and ecx, 31
    sub rdx, rcx
    add rdx, 32                 ; 00000020H
    mov QWORD PTR [rbx], rdx
; Linie 35
    add rsp, 32                 ; 00000020H
    pop rbx
    ret 0

Frage: ist dies eine unverzichtbare Eigenschaft von Funktionen wie malloc? Können wir es irgendwie inline bearbeiten, um es zu inspizieren (oder eine andere Funktion wie strcmp/new/free/delete)? Ist dies verboten?

3voto

Mats Petersson Punkte 123984

Typischerweise wird der Compiler Funktionen inline schalten, wenn er den Quellcode während der Kompilierung verfügbar hat (mit anderen Worten, die Funktion ist definiert, anstatt nur eine Prototypendeklaration) in einer Headerdatei).

In diesem Fall ist die Funktion (malloc) jedoch in einer DLL, sodass der Quellcode dem Compiler während der Kompilierung Ihres Codes nicht zur Verfügung steht. Es hat nichts damit zu tun, was malloc macht (etc). Es ist jedoch auch wahrscheinlich, dass malloc sowieso nicht inline geschaltet wird, da es sich um eine ziemlich große Funktion handelt [zumindest ist sie oft], was verhindert, dass sie inline geschaltet wird, selbst wenn der Quellcode verfügbar ist.

Wenn Sie Visual Studio verwenden, können Sie den Quellcode Ihrer Laufzeitbibliothek fast sicher finden, da er mit dem Visual Studio-Paket geliefert wird.

(Die C-Laufzeitfunktionen befinden sich in einer DLL, da viele verschiedene Programme im System dieselben Funktionen verwenden. Sie in einer DLL zu platzieren, die einmal für alle "Benutzer" der Funktionalität geladen wird, führt zu einer guten Einsparung bei der Größe des gesamten Codes im System. Obwohl malloc möglicherweise nur ein paar hundert Bytes groß ist, kann eine Funktion wie printf leicht 5-25 KB zur Größe einer ausführbaren Datei hinzufügen. Multiplizieren Sie das mit der Anzahl der "Benutzer" von printf, und es werden wahrscheinlich mehrere hundert Kilobytes nur von dieser einen Funktion "gespeichert" - und natürlich tragen alle anderen Funktionen wie fopen, fclose, malloc, calloc, free usw. jeweils ein wenig zur Gesamtgröße bei)

1voto

rici Punkte 218780

Ein C Compiler darf malloc inline übersetzen (oder, wie Sie in Ihrem Beispiel sehen, einen Teil davon), aber er ist nicht verpflichtet, irgendetwas inline zu übersetzen. Die Heuristiken, die er verwendet, müssen nicht dokumentiert werden, und sie sind normalerweise ziemlich komplex, aber normalerweise werden nur kurze Funktionen inline übersetzt, da ansonsten wahrscheinlich Code-Bloat auftritt.

1voto

RichieHindle Punkte 256891

malloc und verwandte Funktionen sind in der Laufzeitbibliothek implementiert, daher sind sie nicht für das Einbetten verfügbar. Ihre Implementierung müsste in ihren Headerdateien stehen, damit dies geschehen könnte.

Wenn Sie ihren Disassemblierungscode sehen möchten, könnten Sie mit einem Debugger in sie hineinspringen. Oder je nach Compiler und Laufzeitumgebung, die Sie verwenden, könnte der Quellcode verfügbar sein. Er ist zum Beispiel für gcc und msvc verfügbar.

1voto

Jonathan Leffler Punkte 694013

Das Hauptproblem, das die Inline-Einfügung von malloc() und anderen Funktionen verhindert, ist deren Komplexität - und die offensichtliche Tatsache, dass keine Inline-Definition der Funktion bereitgestellt wird. Außerdem benötigen Sie möglicherweise zu verschiedenen Zeiten verschiedene Versionen der Funktion; es wäre schwieriger (chaotischer) für Tools wie valgrind zu arbeiten, und Sie könnten keine Debugging-Version der Funktionen verwenden, wenn ihr Code inline erweitert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X