souvent lors de la codage en C ++, je vais mettre fin à Il y a un lot em> du code avec ce phénomène. Donc, la question est la suivante: p> existe-t-il Si la version littérale à chaîne est moins efficace, le compilateur l'optimise-il à la version de la constante de caractères, car les deux offrent exactement le même comportement? p> li>
Je suis aussi familier avec J'ai recherché la bibliothèque standard C ++, mais je n'ai pas trouvé les implémentations des surcharges pertinentes de l'opérateur mais pas d'indices quant à la façon dont les mécaniciens bouchent dans la mise en oeuvre. P> < P> C'est plus une question théorique que tout, donc je ne suis pas intéressé à lire "Il n'y a pas de quart de différence praticable entre les deux." Je sais que. Je me demandais simplement s'il y a une différence du tout et comment le compilateur traite avec cela. P> p> COUT code> des instructions avec une nouvelle ligne (
\ n code>). Cependant, mon instinct a toujours été d'exprimer cette nouvelle ligne en tant que littéral à chaîne:
"\ n" code>, même s'il s'agit d'un seul caractère et peut être exprimé plus efficacement comme un charcuté (
\ n ' code>).
Par exemple:
std :: endl code>. La documentation indique que "ce manipulateur est souvent utilisé à tort lorsqu'un simple nouveau ligne est souhaité, conduisant à une mauvaise performance tampon." Et pointe vers Cet article Pour plus d'informations. Toutefois, que l'article indique que les "performances médiocres" ne s'appliquent que pour déposer des E / S et que l'utilisation de
endl code> pour écrire à l'écran peut réellement améliorer les performances. Quel est l'accord avec ça? p> li>
ol>
<<< / code>. J'ai trouvé les déclarations dans
ostream.tcc code>: p>
3 Réponses :
Je doute fortement, car il change à la fois la mise en page de la mémoire (l'un a un ttérinateur null, l'autre ne signifie pas), et parce que cela impliquerait de modifier le type réel du littéral (et, par extension, changeant la fonction que l'on appelle). Il s'agirait donc d'une transformation invalide dans la grande majorité des cas, et pas assez d'aide dans la minorité minuscule à compter.
qui dit, si le compilateur fait suffisamment d'affranchissement agressif (enlignant la fonction elle-même et les données constantes dans La fonction), vous pourriez vous retrouver avec efficacement le même code. Par exemple, CLANG compile les éléments suivants: p> dans ceci: p> Comme vous pouvez le constater, l'affranchissement a rendu le deux cas presque identiques. (Et, en fait, le cas '\ n' code> est légèrement plus complexe car le caractère doit être mis sur la pile.) P> p>
D'autre part, je me souviens de voir printf ("\ n") code> étant optimisé pour
Putc ('\ n') code>, donc je ne serais donc pas aussi surpris par ce une optimisation.
Printf CODE> est un C.EC intégré à optimiser de toutes sortes de façons. Par exemple,
printf ("bla \ n") code> se transforme en
met ("bla") code>.
Les différents entre string littéral \ n code> et
endl code> est-ce: p>
\ n code> est un littéral à chaîne qui est annexé à stdout.
endl code> ajoutera également le caractère NEWLINE à STDOUT, cependant, il affleurera également le tampon stdout. Par conséquent, cela peut prendre plus de traitement. Autre que cela, il ne devrait y avoir aucune différence pratique. P>
Ils sont probablement optimisés pour une chaîne (par unité de compilation) - la plupart des compilateurs "fusionnent des chaînes du même contenu". p>
J'attendrais qu'il y ait très peu de différence pratique, autre que le fait que vous passez un pointeur à une seule chaîne de caractères. p>
à vos questions concrètes: p>
char * code> nécessitera une indirection et générera ainsi quelques instructions supplémentaires à exécuter. Pour la sortie de la console (plutôt que la sortie au fichier), il n'est pas important, car le défilement de la console, même en mode texte plein écran, est> 100x Plus d'instructions. li>
- en doute. li>
- SO
std :: endl code> affleurera la mémoire tampon, ce qui réduit effectivement la sortie aux fichiers, car les secteurs ou les blocs partiels sont écrits dans le fichier, ce qui augmente les frais généraux d'appel système. Si vous utilisez "\ n" code>, le fichier n'est pas rincé tant que le tampon lui-même est rempli, ce qui serait au moins 512 octets, éventuellement autant que plusieurs dizaines de kilo-octets. Mais comme pour la réponse n ° 1, la performance de sortie de la console dépendra davantage de la vitesse que l'écran peut faire défiler l'écran. li>
ol>
Le seul "One Char String Literal" qui existe est une chaîne vide. N'oubliez jamais le terminateur zéro.
"\ n" code> est de type
const char [2] code>, comment cela peut-il être optimisé i> à un seul caractère? En outre, votre question 3 semble non liée et devrait probablement être affichée comme une question distincte.
L'OP est pleinement conscient de la différence de stockage, les gars. qui est couvert dans le premier paragraphe. L'OP demande si la chaîne C peut être substituée par le compilateur de ce cas spécial d'un caractère. Le seul Char ne nécessite aucun terminateur.
@Praetorian: certainement
'\ n' code> et
"\ n" code> sont différents et ce dernier ne peut pas être optimisé pour l'ancien en général i> . Mais
cout << '\ n' code> et
cout << "\ n" code> ont exactement le même comportement et un compilateur est autorisé à tirer parti de sa connaissance du
Cout code> et le
<<< / code> Opérateur pour transformer l'une à l'autre. Si les compilateurs se préoccupent réellement de le faire est une autre question.