Pour un programme écrit en C ++, j'ai besoin de deux énormes tableaux de chaînes contenant des données.
Ils sont définis dans un fichier d'en-tête comme suit: P>
"last line."};
3 Réponses :
Je crois que ceux-ci sont des problèmes connus dans GCC. Vous ne dites pas quelle version de GCC que vous utilisez, vous devriez peut-être essayer avec la dernière version stable de GCC, pour voir si elle le fait ou n'améliore pas les choses. P>
Vous ne devez probablement pas garder toute votre chaîne dans le code source. Vous devez probablement les charger du fichier externe au démarrage ou tel. P>
D'accord, en conservant les chaînes externes et chargées au démarrage, le programme est beaucoup plus facile à modifier. Cela nécessite une modification de code pour corriger les fautes de frappe dans une chaîne.
@ Chris.Stover en général, je suis d'accord avec vous les deux. Toutefois, si, par exemple, vous stockez le schéma de votre fichier de configuration dans votre code source, je pense que c'était une bonne idée pour des raisons de sécurité.
GCC --Version donne "GCC (Ubuntu / Linaro 4.7.2-111LUCID3) 4.7.2", la dernière fois que je pourrais obtenir. Les fichiers de données externes peuvent être une solution, mais je veux juste un seul exécutable, pas plusieurs fichiers différents.
Vous ne devez pas utiliser std :: string code> pour cela. Utilisez plutôt un ancien
Const Char * CODE>:
const char * const strdataA[30000] = {
"one",
"two",
//...
};
Cela a fait l'affaire en effet, elle compile maintenant en un clin d'œil. Merci!
Que puis-je faire afin d'accélérer le processus de compilation? P> blockQuote>
const Char * strdataaa ... code> devrait accélérer le processus de compilation. Parce que dans votre version actuelle, g ++ doit créer une énorme liste d'appels constructeurs pour chaque chaîne. P>
Merci, c'est la solution en effet.
De combien de lignes parlez-vous? Y a-t-il vraiment 30 000 et 60 000 chaînes dans votre source?
Je suppose qu'ils sont dans un fichier source et non un fichier d'en-tête.
Vous réalisez que le chargeur doit faire fondamentalement la même chose que vous le feriez si vous avez chargé les chaînes d'un fichier externe?
S'ils sont des textes constants, la compilez une fois et être fait. S'ils changent souvent, mettez-les dans une base de données.
Oui, il y a 30 000 et 60 000 chaînes, ce qui correspond à environ 9 Mo de données, ce qui n'est pas beaucoup. Ils sont dans un fichier d'en-tête. Je ne les veux pas dans des fichiers externes, car je ne veux pas toutes sortes de fichiers supplémentaires, je veux juste un seul exécutable. Un tableau à chaîne est facile d'un point de vue de programmation.
J'ai essayé cela avec 30 000 chaînes et g ++ a pris environ 1,2 Go de mémoire. Ajouter une mémoire à éviter l'échange devrait aider à la vitesse de compilation.
Comparaison de temps entre
std :: string code> tableau et
Char * code> est de 5 minutes VS 2 secondes. La taille d'objet diminue d'environ 5 Mo à seulement 1 Mo.
En outre, déplacez les littéraux vers une seule unité de traduction, en dehors des en-têtes. Fournir juste une déclaration
extern code> dans l'en-tête, et qui réduira le coût à une seule unité de traduction (plutôt que tous les utilisateurs de l'en-tête)