2013-05-16 3 views
1

Je travaille sur une application de chiffrement qui implémente un algorithme que j'ai fait. J'ai environ une année d'expérience en C et 6 mois d'expérience en C++, mais j'ai 6 ans d'expérience en Visual Basic et Gambas (et j'espère que je suis un apprenti rapide). Je veux rendre ma nouvelle application aussi efficace que possible; C'est la raison pour laquelle j'ai choisi C au lieu de C++ (je voulais utiliser une sorte de langage de bas niveau).Constantes de chaînes définies libres

Dans mon programme, j'utilise des constantes String définies pour gérer les messages d'erreur. Je sais que le préprocesseur remplace le nom de la macro par la chaîne actuelle dans chaque occurrence. Si je ne me trompe pas, cela signifie qu'il pré-alloue la constante chaîne et renvoie un pointeur différent pour chaque occurrence. Dois-je libérer tous ces pointeurs de chaîne? En fait, cela semble un peu étrange ... Leurs pointeurs aiment-ils les variables automatiques (ce qui signifie qu'ils sont libérés à la sortie de la portée) ou restent-ils éternellement comme des constantes? J'utilise un fichier d'en-tête dédié appelé messages.h, qui contient les définitions de tous les messages d'erreur possibles que le programme peut utiliser, de sorte que je puisse changer la langue, etc. plus facilement; ainsi je ne peux pas les écrire comme des constantes de chaîne directement. J'ai pensé à les déclarer comme des variables constantes, mais soit je dois utiliser un fichier C avec les valeurs réelles et déclarer les versions d'en-tête comme extern, ou avoir toutes les constantes re-déclarées dans chaque fichier que j'inclue l'en-tête messages.h croyez-moi, j'ai plus de 20 fichier constitué de ce projet, et environ 50-100 messages, plus les messages d'invite — environ 30 longs — de sorte qu'il consommerait beaucoup de mémoire).

Que suggérez-vous? Est-ce que — et plus important encore — peut-il libérer les pointeurs vers les constantes?

+0

Si elles apparaissent en tant que littéraux de chaîne dans la source prétraite, il n'est pas nécessaire de les libérer (en fait, toutes les raisons pour ne pas les libérer) car elles ne sont pas allouées dynamiquement. –

+0

Et l'accumulation de nombreuses instances de la même macro à longue chaîne n'utilise-t-elle pas la mémoire? – someone

+1

Seulement si la macro est utilisée, et même alors, il est dans le segment de texte, pas le segment de données. Cela dépend du formulaire que vous utilisez pour 'définir' les messages. Si l'en-tête indique 'static const char message1 [] =" blah ";' dans l'en-tête, alors vous perdez de l'espace. S'il dit '#define message1" blah "', vous n'encourez l'espace que lorsqu'il est utilisé. S'il est dit 'extern const char message1 [];' dans l'entête, alors vous n'avez qu'une copie de chaque chaîne dans le fichier qui définit (par opposition à déclarer) les variables. –

Répondre

1

Bienvenue dans C, J'espère que vous ne retournerez jamais à VB;), macros, non, vous n'avez pas à libérer ces "chaînes", et il ne retourne pas un pointeur différent pour chaque occurrence, jetez un oeil:

#include <stdio.h> 

#define ERROR_MSG "Bla bla bla" 

int main(void) 
{ 
    printf("%p\n", (void *)ERROR_MSG); 
    printf("%p\n", (void *)ERROR_MSG); 
    return 0; 
} 

sortie:

0x40061c 
0x40061c 

Comme vous pouvez le voir la même adresse est imprimée.

+2

Il pourrait renvoyer un pointeur différent à chaque fois. La norme C (ISO/CEI 9899: 2011) indique dans la Section 6.4.5 ** Littéraux de chaîne **: _Il n'est pas spécifié si ces tableaux sont distincts à condition que leurs éléments aient les valeurs appropriées . Si le programme tente de modifier un tel tableau, le comportement est non défini. Les tableaux en question sont ceux associés aux littéraux de chaîne, bien sûr. –

+0

Oh, ouais! Que la réponse définitive dont j'avais besoin ...J'ai lu que les instructions du pré-processeur remplacent simplement les choses à l'intérieur du code, donc je pensais que lorsque le compilateur trouverait deux instances du même message, il ne pourrait pas comprendre que c'est la même chose (gcc semble plus intelligent que cela)! Merci beaucoup!!! : D – someone

+0

Alors, nous errons dans les ténèbres? – someone

Questions connexes