Domanda

Qual è la differenza eventuale tra gli effetti dei seguenti frammenti:

cout << "Some text" << s1 << "some more text\n";

cout << "Some text" + s1 + "some more text\n";
È stato utile?

Soluzione

Il risultato dell'operatore + sulle stringhe è una nuova stringa. Pertanto, nell'esempio

cout << "Some text" + s1 + "some more text\n";

due nuove stringhe vengono creati (implica l'allocazione della memoria) prima che il tutto è scritto a cout. Nel tuo primo esempio, tutto è scritto direttamente a cout senza allocazione di memoria necessaria.

Altri suggerimenti

Si consideri il seguente:

cout << "Some text" + " " + "some more text\n";

Non farà quello che pensi. Operatore + non significa sempre concatenate.

Modifica Quando viene applicato a stringhe prime, l'operatore + non concatenare - aggiunge gli indirizzi dei puntatori alle corde. Il risultato è quasi sicuro che sia una sciocchezza, perché punta ad una zona di memoria che non ha alcuna relazione con una qualsiasi delle stringhe originali. Con la fortuna andrà in crash il programma.

Modifica 2: A quanto pare è stato un molto tempo da quando ho fatto questo errore. I risultati sono così prive di senso che il compilatore si rifiuta di compilarlo.

Si, string operator+ (const char* lhs, const string& rhs) crea e restituisce un oggetto stringa temporanea senza nome.

cout << "Some text" chiama ostream & ostream :: operator << (const char * const) e restituisce il riferimento ostream.

cout << "Some text" << s1 << "some more text\n";

è ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n"), tre chiamate su cout, chiamando due diversi overload di op <<, l'op << che prende un const* char* const e l'op << che prende un const string&. Nessun allocazioni di memoria, e l'unica copia è al buffer di cout.

cout << "Some text" + s1 + "some more text\n";

è ostream::operator<<(t1) su un oggetto stringa temporanea chiamerò t1 , che T1 è il risultato temporaneo da ::operator+ ( "Some text", s1).operator+("some more text\n"). (Si noti che il primo operatore + non è membro di corda, ma l'op + (const char * const, const string &) a perimetro dello spazio dei nomi. Si restituisce una stringa, quindi la seconda +" è string :: operator + (const char * const) .)

Quindi, vengono creati due oggetti stringa temporanea (e poi distrutti), in questo codice. Ciò significa che due rappresentazioni interne per corde (così due allocazioni di memoria) e due copie due che appena allocata memoria (in aggiunta alla copia al buffer di cout).

Il secondo concatena le stringhe prima di inviarli a cout, che è un calo di prestazioni, potenzialmente molto ampia con grandi archi. Hai sempre voglia di utilizzare la prima forma, se è possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top