autant que je sache, l'éditeur de liens tente de fusion deux littéraux de chaîne en un seul littéral, si elles sont à la fois la même chose, par exemple:chaîne C littéraux reliant
fichier1.c
char const* firstString = "foo";
file2.c
char const* secondString = "foo";
résulterait en une seule occurrence de foo\0
dans la section de mémoire respective (gain de 4 octets). Ceci est particulièrement important pour les applications embarquées (comment se comporte le avr-gcc
par rapport au gcc
). Mais je me demandais si je pouvais vraiment compter sur cela, et je suppose que si deux chaînes sont égales, leurs pointeurs sont égaux (à condition que dans tout le programme, vous ne passiez que des chaînes de caractères et pas d'exécution). les chaînes générées existent - ce qui est une hypothèse raisonnable dans mon cas). De toute évidence, je veux accélérer les comparaisons de vitesse avec cela, et permettre une fonction couramment utilisée pour recevoir une chaîne littérale comme ceci:
void lock(char const*);
void unlock(char const*);
lock("test");
dosmth();
unlock("test");
Essentiellement, je veux éviter un trop grand ENUM et d'énormes commutateurs à l'intérieur du lock
/unlock
fonctions.
La norme C ne donne pas de telles garanties –
Note: J'ai modifié la question pour indiquer que toutes les chaînes sont immuables. – bitmask
L'utilisation de chaînes à cet effet est au-delà de la rupture. –