Heim Backend-Entwicklung Golang Optimieren 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;
};
Nach dem Login kopieren
Nach dem Login kopieren

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;
};
Nach dem Login kopieren
Nach dem Login kopieren

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;
};
Nach dem Login kopieren
Nach dem Login kopieren

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;
};
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Erklärung dieser Website
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

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ße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Wie gibt ich die mit dem Modell in Beego Orm zugeordnete Datenbank an? Apr 02, 2025 pm 03:54 PM

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...

Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Ist es vielversprechender, Java oder Golang von Front-End zu Back-End-Entwicklung zu verwandeln? Apr 02, 2025 am 09:12 AM

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

So konfigurieren Sie die automatische Expansion von MongoDB auf Debian So konfigurieren Sie die automatische Expansion von MongoDB auf Debian Apr 02, 2025 am 07:36 AM

In diesem Artikel wird vorgestellt, wie MongoDB im Debian -System konfiguriert wird, um eine automatische Expansion zu erzielen. Die Hauptschritte umfassen das Einrichten der MongoDB -Replikat -Set und die Überwachung des Speicherplatzes. 1. MongoDB Installation Erstens stellen Sie sicher, dass MongoDB im Debian -System installiert ist. Installieren Sie den folgenden Befehl: sudoaptupdatesudoaptinstall-emongoDB-org 2. Konfigurieren von MongoDB Replika-Set MongoDB Replikate sorgt für eine hohe Verfügbarkeit und Datenreduktion, was die Grundlage für die Erreichung der automatischen Kapazitätserweiterung darstellt. Start MongoDB Service: SudosystemctlstartMongodsudosysys

See all articles