Speichern von enormen statischen Variablen in C ++

8

Ich habe eine Informationskette, die ungefähr 17 kb lang ist. Mein Programm wird diese Zeichenfolge nicht generieren oder in einen Puffer lesen - die Daten sind bereits initialisiert, ich möchte, dass sie wie in einer statischen Variable aus meinem Code kompiliert werden. Außerdem wäre es viel lieber, wenn es sich in meiner ausführbaren Datei befindet und nicht in einer Projektdatei gespeichert ist. Ich bin noch nie auf solch ein Problem gestoßen. Was ist der beste Weg, dies zu umgehen? Sollte ich den enormen Datenstrom in eine Variable als Ressource einschließen oder buchstäblich kopieren und einfügen? Was würdest du empfehlen?

Vergessen zu erwähnen, verwende VisualStudio C ++ 2015, wenn das wichtig ist

    
DudeDudeDude 22.02.2017, 06:56
quelle

1 Antwort

3

Der GNU-Linker ld kann benutzerdefinierte Daten direkt in den .data -Abschnitt einer Objektdatei einfügen:

%Vor%

Die resultierende Datei example.o enthält Symbole, die für den Zugriff auf Anfang und Ende der eingebetteten Daten definiert sind (sehen Sie sich die Datei mit objdump an, um zu sehen, wie sie benannt wird).

Nun weiß ich nicht, ob der Linker, der mit Visual Studio kommt, eine ähnliche Fähigkeit hat, aber ich denke, Sie könnten den GNU-Linker entweder über mingw oder auch über cygwin verwenden (da die generierte Objektdatei nicht auf die Standardbibliothek verweist) Sie werden nicht die Emulation lib, die mit Cygwin kommt) benötigen. Die resultierende Objektdatei kann anscheinend nur zu Ihren Quellen wie eine normale Quelle hinzugefügt werden Datei .

Natürlich ist dieser manuelle Workflow nicht so gut, wenn sich die Daten oft ändern ...

Alternativ können Sie ein einfaches Programm schreiben, das den Inhalt der Datei in eine C-Zeichenfolge wie folgt einfügt:

%Vor%

Natürlich gibt es schon ein solches Programm ( xdd ), aber ich weiß nicht, ob es Ihnen zur Verfügung steht. Ein mögliches Problem ist, dass Sie erreicht die Grenze für die Länge von String-Literalen auf diese Weise . Um das zu umgehen, könnten Sie ein (mehrdimensionales) Char-Array ausprobieren.

(Beim Schreiben dieser Antwort fand ich diesen Blogbeitrag sehr hilfreich.)

    
Daniel Jour 22.02.2017 11:11
quelle

Tags und Links