suchen
HeimBackend-EntwicklungGolangOptimieren von C-Struktur-Layouts

Optimieren von C-Struktur-Layouts

Jan 03, 2025 pm 01:57 PM

Betrachten wir eine einfache Struktur:

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};

Angenommen, dieser Code wird als Teil eines Programms ausgeführt, das auf einem 64-Bit-Computer ausgeführt wird: Welches Ergebnis würden Sie von sizeof(struct foo) erwarten?

Die meisten Leute, die sich nie mit Strukturgrößen und Optimierungen herumschlagen mussten, würden vermuten, dass es 17 sein sollte...

... aber es sind 24! Warum ist das so?

Der Grund für dieses Verhalten liegt darin, dass Compiler Strukturlayouts auf Geschwindigkeit optimieren und es die moderne Norm ist, dass ausgerichtete Speicherzugriffe der schnellste Weg sind, auf Daten zuzugreifen.

Das bedeutet, dass Ihre Daten je nach Feldtyp und CPU eine gewisse Ausrichtung haben und so positioniert werden, dass diese Ausrichtung berücksichtigt wird (oder so, dass Feldadresse % Feldausrichtung == 0).

Größe, Ausrichtung, Polsterung

Im Fall des vorherigen Beispiels sind Zeiger und 64-Bit-Felder auf 64-Bit-Maschinen 8B-ausgerichtet. Das bedeutet, dass der Compiler einige generieren wird, um ein Layout zu erzwingen, bei dem alles in der Struktur ausgerichtet ist Abstand zwischen den Feldern flag und len:

optimizing c structs layouts

Betrachten wir nun ein weiteres Beispiel, in dem eine Struktur wie diese auf demselben Computer wie zuvor definiert wird:

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};

Wie berechnen wir seine Größe?

Es gibt drei Regeln:

  • Strukturfelder möchten an ihrer eigenen natürlichen Ausrichtung ausgerichtet sein.
  • Die gesamte Strukturausrichtung entspricht der Ausrichtung ihres breitesten Feldes
  • Wenn Sie zwei Strukturen desselben Typs nebeneinander platzieren müssten, sollte die zweite Struktur an ihrer Ausrichtung ausgerichtet sein – das bedeutet, dass Strukturen bis zu ihrer Ausrichtung eine abschließende Auffüllung haben müssen

Kurze Zusammenfassung der grundlegenden Typausrichtung und -größe für 64-Bit-Maschinen:

type size alignment
char 1 1
short 2 2
int 4 4
long 8 8
float 4 4
double 8 8
pointers 8 8

Denken Sie auch daran:

  • Arrays haben die Ausrichtung ihres Werttyps und eine Größe, die sizeof(type) * Elementanzahl ist.
  • Gewerkschaften haben die Ausrichtung und Größe ihres breitesten Mitglieds.

Und Sie können die äußerst nützlichen Operatoren sizeof und _Alignof verwenden, um diese Informationen für Ihre benutzerdefinierten Typen abzurufen. Beachten Sie, dass _Alignof ab C11 verfügbar ist und ab C23 alignof heißt. Es stimmte immer mit dem überein, was ich in C verstehe, seit C 11.

Für weitere Informationen: Die Bibel zu diesem Thema ist „The Lost Art of Structure Packing“, aus der ich fast alles gelernt habe, was ich darüber weiß, zusammen mit viel Übung und praktischer Erfahrung.

Optimierung Ihrer Strukturen: Stropt

Dieses Thema kommt bei der Arbeit ziemlich häufig zur Sprache, wo das Einsparen von Bytes hier und da sehr wichtig ist, wenn große Datenmengen kontinuierlich in Warteschlangen gesendet werden und so weiter.

Um mir das Leben zu erleichtern, habe ich ein Tool geschrieben, das einige Statistiken zu einem Typ erstellt, den Sie als Eingabe übergeben, unter Bezugnahme auf eine Quelldatei oder einen Codeausschnitt. Es heißt stropt (Strukturoptimierer).

Abathargh/stropt auf GitHub

bauen und installieren

Wenn Sie über eine lokale Go-Installation verfügen, können Sie die Anwendung direkt erstellen oder installieren:

struct foo {
    const char * str;
    unsigned char flag;
    uint64_t len;
};

Bereits kompilierte Binärdateien für eine Liste von OS/Archs-Kombinationen werden auch auf der Github-Release-Seite bereitgestellt:

Stropt-Binärdateien

Verwendung des Tools

Sie können entweder stropt verwenden, indem Sie die zu analysierende Quelle als Zeichenfolge übergeben:

struct bar {
    const char * str;
    short s1;
    int i1
    short s2;
    int i2;
};

optimizing c structs layouts

Oder Sie können eine Datei übergeben, in der die Definition enthalten ist:

git clone https://github.com/Abathargh/stropt
go build

// or, if you want to install this directly
go install github.com/Abathargh/stropt

optimizing c structs layouts

Das Tool kann auch eine mögliche Optimierung für Ihre Typen bereitstellen, indem es das Flag -optimize verwendet, und es erkennt Felder, die selbst Strukturen sind:

optimizing c structs layouts

Beachten Sie, dass das Verbose-Flag verwendet wird, um innere Strukturen (und Vereinigungen) zusammen mit ihrer Feldausrichtung und -größe anzuzeigen.

was kommt als nächstes

Dieses Tool wurde in go unter Verwendung des großartigen C-Compiler-Frontends modernc.org/cc zum Parsen von C-Code und Lipgloss von Charmbracelet für die Benutzeroberfläche geschrieben.

Ich schreibe dies für mich selbst, teile es aber gerne öffentlich. Ich würde dies gerne zu einer Webanwendung machen, damit sie einfacher direkt in einem Browser verwendet werden kann, also ist das wahrscheinlich das nächste, woran ich arbeiten werde!

Das obige ist der detaillierte Inhalt vonOptimieren von C-Struktur-Layouts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
String Manipulation in Go: Beherrschen des 'Strings' -PaketsString Manipulation in Go: Beherrschen des 'Strings' -PaketsMay 14, 2025 am 12:19 AM

Das Beherrschen des Strings -Pakets in GO -Sprache kann die Funktionen der Textverarbeitung und die Entwicklungseffizienz verbessern. 1) Verwenden Sie die Enthaltende Funktion, um Substrings zu überprüfen. 2) Verwenden Sie die Indexfunktion, um die Substringposition zu ermitteln. Vermeiden Sie vorsichtig, um häufige Fehler zu vermeiden, wie z.

Gehen Sie 'Strings' -Paket -Tipps und TricksGehen Sie 'Strings' -Paket -Tipps und TricksMay 14, 2025 am 12:18 AM

Sie sollten sich um das Strings -Paket in Go kümmern, da es die String -Manipulation vereinfachen und den Code klarer und effizienter gestalten kann. 1) Saiten verwenden. 2) Verwenden Sie Zeichenfolgen. 3) Substringpositionen durch Zeichenfolgen finden. Index und Strings.lastindex; 4) Verwenden Sie Strings.replaceAll, um Zeichenfolgen zu ersetzen; 5) Verwenden von Saiten.Builder, um Strings effizient zu spleißen; 6) Überprüfen Sie die Eingaben immer, um unerwartete Ergebnisse zu vermeiden.

'Strings' -Paket in Go: Ihre Anlaufstelle für String-Operationen'Strings' -Paket in Go: Ihre Anlaufstelle für String-OperationenMay 14, 2025 am 12:17 AM

ThestringspackagesingoiSessentialSticientStringManipulation.1) ItofferSimpeyet-PowerfulfunctionsForfunctionStaskSlikechkesSubstringsandjoiningStrings.2) itHandlesunicodewell, mit Functionslikestrings.Fieldsfordhitspace-separatierte Vala-Valuation.3) -Fassenderformance, st

Go Bytes Package vs Strings Paket: Welches soll ich verwenden?Go Bytes Package vs Strings Paket: Welches soll ich verwenden?May 14, 2025 am 12:12 AM

Whendecidingbetoengo'sByteSpackageAndStringSpackage, useBytes.BufferForBinaryDataandStrings.builderForStringoperationen.1)

So verwenden Sie das 'Saiten' -Paket, um Saiten Schritt für Schritt zu manipulierenSo verwenden Sie das 'Saiten' -Paket, um Saiten Schritt für Schritt zu manipulierenMay 13, 2025 am 12:12 AM

Das Strings -Paket von GO bietet eine Vielzahl von String -Manipulationsfunktionen. 1) Verwenden Sie Strings.Contains, um Substrings zu überprüfen. 2) Verwenden Sie Strings. 3) Fusion Strings durch Strings.join. 4) Verwenden Sie Strings.trimspace oder Zeichenfolgen. 5) Ersetzen Sie alle angegebenen Substrings durch Strings.replaceall. 6) Verwenden Sie Strings.Hasprefix oder Strings.hassuffix, um das Präfix oder das Suffix der Zeichenfolge zu überprüfen.

GO Strings Paket: Wie verbessern Sie meinen Code?GO Strings Paket: Wie verbessern Sie meinen Code?May 13, 2025 am 12:10 AM

Durch die Verwendung des Pakets für GO Language Strings kann die Codequalität verbessert werden. 1) Verwenden Sie Zeichenfolgen. 2) Kombinieren Sie Strings.Split () und Zeichenfolgen. Enthält (), um Text zu verarbeiten und auf Probleme der Fallsensitivität zu achten. 3) Vermeiden Sie den Missbrauch von Strings.replace () und in Betracht, regelmäßige Ausdrücke für eine große Anzahl von Substitutionen zu verwenden. 4) Verwenden Sie Strings.Builder, um die Leistung häufig Spleißstrings zu verbessern.

Was sind die nützlichsten Funktionen im Go Bytes -Paket?Was sind die nützlichsten Funktionen im Go Bytes -Paket?May 13, 2025 am 12:09 AM

Das Bytes -Paket von GO bietet eine Vielzahl von praktischen Funktionen, um Byte -Schneiden zu verarbeiten. 1.Bytes.Contains wird verwendet, um zu prüfen, ob das Byte -Schicht eine bestimmte Sequenz enthält. 2.Bytes.Plit wird verwendet, um Bytescheiben in kleinere Produkte aufzuteilen. 3.Bytes.Join wird verwendet, um mehrere Bytescheiben in eine zu verkettet. 4.Bytes.trimspace wird verwendet, um die vorderen und hinteren Rohlinge von Bytescheiben zu entfernen. 5.Bytes.Equal wird verwendet, um zu vergleichen, ob zwei Byte -Scheiben gleich sind. 6.Bytes.Index wird verwendet, um den Startindex von Unterschriften in den Vargerlices zu ermitteln.

Beherrschen der Binärdatenhandhabung mit GOs 'Codierung/Binär' -Paket: Ein umfassender LeitfadenBeherrschen der Binärdatenhandhabung mit GOs 'Codierung/Binär' -Paket: Ein umfassender LeitfadenMay 13, 2025 am 12:07 AM

Thecoding/binarypackageingoiSessentialBecauseitStrovidesastandardizedwaytoreadandWriteBinaryData, sicherstellen, dass Cross-Plattformcompatibilität und HandlingDifferentendiang.itoffersfunctionsLikeread, Schreiben, Readuvarint und WriteuvarintforprecisecontroloverinaryTecontrolovertinBinartinBinary, sichergestellt

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Nordhold: Fusionssystem, erklärt
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

SublimeText3 Englische Version

SublimeText3 Englische Version

Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools