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
Golang vs. C: Code Beispiele und LeistungsanalyseGolang vs. C: Code Beispiele und LeistungsanalyseApr 15, 2025 am 12:03 AM

Golang eignet sich für eine schnelle Entwicklung und gleichzeitige Programmierung, während C für Projekte, die eine extreme Leistung und die zugrunde liegende Kontrolle erfordern, besser geeignet sind. 1) Golangs Parallelitätsmodell vereinfacht die Parallelitätsprogrammierung durch Goroutine und Kanal. 2) Die Vorlagenprogrammierung von C bietet generische Code und Leistungsoptimierung. 3) Golangs Müllsammlung ist bequem, kann jedoch die Leistung beeinflussen. Die Speicherverwaltung von C ist komplex, aber die Kontrolle ist in Ordnung.

Golangs Auswirkungen: Geschwindigkeit, Effizienz und EinfachheitGolangs Auswirkungen: Geschwindigkeit, Effizienz und EinfachheitApr 14, 2025 am 12:11 AM

GoimpactsDevelopmentPositivyThroughSpeed, Effizienz und DiasMlitication.1) Geschwindigkeit: Gocompilesquickandrunseffiction, idealforlargeProjects

C und Golang: Wenn die Leistung von entscheidender Bedeutung istC und Golang: Wenn die Leistung von entscheidender Bedeutung istApr 13, 2025 am 12:11 AM

C eignet sich besser für Szenarien, in denen eine direkte Kontrolle der Hardware -Ressourcen und hohe Leistungsoptimierung erforderlich ist, während Golang besser für Szenarien geeignet ist, in denen eine schnelle Entwicklung und eine hohe Parallelitätsverarbeitung erforderlich sind. 1.Cs Vorteil liegt in den nahezu Hardware-Eigenschaften und hohen Optimierungsfunktionen, die für leistungsstarke Bedürfnisse wie die Spieleentwicklung geeignet sind. 2. Golangs Vorteil liegt in seiner präzisen Syntax und der natürlichen Unterstützung, die für die Entwicklung einer hohen Parallelitätsdienste geeignet ist.

Golang in Aktion: Beispiele und Anwendungen in realer WeltGolang in Aktion: Beispiele und Anwendungen in realer WeltApr 12, 2025 am 12:11 AM

Golang zeichnet sich in praktischen Anwendungen aus und ist für seine Einfachheit, Effizienz und Parallelität bekannt. 1) Die gleichzeitige Programmierung wird über Goroutinen und Kanäle implementiert, 2) Flexibler Code wird unter Verwendung von Schnittstellen und Polymorphismen geschrieben, 3) Vereinfachen Sie die Netzwerkprogrammierung mit NET/HTTP -Paketen, 4) Effiziente gleichzeitige Crawler erstellen, 5) Debuggen und Optimierung durch Tools und Best Practices.

Golang: Die Go -Programmiersprache erklärtGolang: Die Go -Programmiersprache erklärtApr 10, 2025 am 11:18 AM

Zu den Kernmerkmalen von GO gehören die Müllsammlung, statische Verknüpfung und Unterstützung der Parallelität. 1. Das Parallelitätsmodell von GO -Sprache realisiert eine effiziente gleichzeitige Programmierung durch Goroutine und Kanal. 2. Schnittstellen und Polymorphismen werden durch Schnittstellenmethoden implementiert, so dass verschiedene Typen einheitlich verarbeitet werden können. 3. Die grundlegende Verwendung zeigt die Effizienz der Funktionsdefinition und des Aufrufs. 4. In der fortgeschrittenen Verwendung bieten Scheiben leistungsstarke Funktionen der dynamischen Größenänderung. 5. Häufige Fehler wie Rassenbedingungen können durch Getest-Race erkannt und gelöst werden. 6. Leistungsoptimierung wiederverwenden Objekte durch Sync.Pool, um den Druck der Müllabfuhr zu verringern.

Golangs Zweck: Aufbau effizienter und skalierbarer SystemeGolangs Zweck: Aufbau effizienter und skalierbarer SystemeApr 09, 2025 pm 05:17 PM

Go Language funktioniert gut beim Aufbau effizienter und skalierbarer Systeme. Zu den Vorteilen gehören: 1. hohe Leistung: Kompiliert in den Maschinencode, schnelle Laufgeschwindigkeit; 2. gleichzeitige Programmierung: Vereinfachen Sie Multitasking durch Goroutinen und Kanäle; 3. Einfachheit: präzise Syntax, Reduzierung der Lern- und Wartungskosten; 4. plattform: Unterstützt die plattformübergreifende Kompilierung, einfache Bereitstellung.

Warum scheinen die Ergebnisse der Ordnung nach Aussagen in der SQL -Sortierung manchmal zufällig zu sein?Warum scheinen die Ergebnisse der Ordnung nach Aussagen in der SQL -Sortierung manchmal zufällig zu sein?Apr 02, 2025 pm 05:24 PM

Verwirrt über die Sortierung von SQL -Abfragenergebnissen. Während des Lernens von SQL stoßen Sie häufig auf einige verwirrende Probleme. Vor kurzem liest der Autor "Mick-SQL Basics" ...

Ist die Konvergenz für Technologiestapel nur ein Prozess der Technologie -Stapelauswahl?Ist die Konvergenz für Technologiestapel nur ein Prozess der Technologie -Stapelauswahl?Apr 02, 2025 pm 05:21 PM

Die Beziehung zwischen Technologiestapelkonvergenz und Technologieauswahl in der Softwareentwicklung, der Auswahl und dem Management von Technologiestapeln ist ein sehr kritisches Problem. In letzter Zeit haben einige Leser vorgeschlagen ...

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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.