2017-02-22 3 views
8

Ich habe eine Reihe von Informationen, die in etwa 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ürden Sie empfehlen?Speicher enorme statische Variablen in C++

vergessen zu erwähnen, sind mit Visual Studio C++ 2015 wenn es ankommt

+3

Halten Sie es in einem anderen CPP-Datei ein eine extern in einem Header setzen, so dass Sie darauf zugreifen können. Auf diese Weise wird eine anständige Build-Umgebung sie nicht weiter aufbauen. – user4581301

+0

, die sie benötigen in einer anderen Datei gespeichert werden, ich das Risiko von Dateien nicht will, ist fehl am Platze und würde die Fähigkeit lieber direkt in der EXE- – DudeDudeDude

+3

@DudeDudeDude In einer anderen ** '.cpp' ** Datei einzuzubetten, die bedeutet, dass es immer noch kompiliert werden würde und das Auslassen würde Ihnen Verbindungsfehler geben. – Angew

Antwort

3

Der GNU-Linker ld hat die Fähigkeit, direkt benutzerdefinierte Daten als .data Abschnitt einer Objektdatei enthalten:

ld -r -b binary -o example.o example.txt 

Die resultierenden example.o Datei hat Symbole definiert für den Anfang und das Ende der eingebetteten Daten zugreifen (schauen Sie sich die Datei mit objdump an, um zu sehen, wie sie benannt sind).

Jetzt weiß ich nicht, ob der Linker mit Visual Studio 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 den Standard nicht referenziert) lib benötigen Sie nicht die Emulation lib, die mit cygwin kommt). Die resultierende Objektdatei apparently can just be added to your sources like a regular source file.

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

Alternativ können Sie ein einfaches Programm schreiben, das den Inhalt der Datei in einer C-String setzt, wie:

unsigned char const * const data = { 
    0x12, 0x34, 0x56 }; 

natürlich gibt es bereits ein solches Programm (xdd), aber ich weiß nicht, ob es Ihnen zur Verfügung steht. Ein potenzielles Problem ist, dass Sie reach the limit for the length of string literals that way. Um das zu umgehen, könnte man ein (mehrdimensionales) Char-Array ausprobieren.

(Wenn diese Antwort schreiben ich this blog post sehr hilfreich.)