(c/c++) le copie dei valori letterali stringa condividono la memoria nella sezione TEXT?

StackOverflow https://stackoverflow.com/questions/1870329

  •  18-09-2019
  •  | 
  •  

Domanda

Se chiamo una funzione come myobj.setType ("fluido");quante volte in un programma, quante copie del "fluido" letterale vengono salvate in memoria?Il compilatore può riconoscere che questo letterale è già definito e semplicemente fare nuovamente riferimento ad esso?

È stato utile?

Soluzione

Credo che in C / C ++ non v'è alcun trattamento specifico per quel caso, ma nella maggior parte dei casi sarebbe utilizzare più definizioni di quella stringa.

Altri suggerimenti

Questo non ha nulla a che fare con C++ (il linguaggio).Si tratta invece di una "ottimizzazione" che un compilatore può eseguire.Quindi, la risposta E NO, a seconda del compilatore/piattaforma che stai utilizzando.

@David Questo è dal ultima bozza della lingua:

§ 2.14.6 (pagina 28)

Se tutti i letterali di stringa sono distinti (cioè sono archiviati in oggetti non sovrapposti) è implementazione definito.L'effetto del tentativo di modificare una stringa letterale è non definito.

L'enfasi è mia.

In altre parole, i valori letterali stringa in C++ lo sono immutabile perché la modifica di una stringa letterale è un comportamento indefinito.Quindi, il compilatore è gratuito, per eliminare le copie ridondanti.

A proposito, sto parlando solo di C++ ;)

Sì, è possibile. Naturalmente, dipende dal compilatore. Per VC ++, è ancora configurabile:

http://msdn.microsoft.com/ it-it / library / s0s0asdt (VS.80) aspx

Sì, è possibile, ma non c'è alcuna garanzia che sarà così. Definire una costante, se si vuole essere sicuri.

Questo è un problema di implementazione del compilatore. Molti compilatori che ho utilizzato hanno la possibilità di condividere o unire stringhe letterali duplicati. Permettere stringhe letterali duplicati accelera il processo di compilazione, ma produce file eseguibili più grandi.

2.13.4 / 2:. "Se tutte le stringhe sono distinte (cioè, vengono memorizzate in oggetti sovrapposti) dipende dall'implementazione"

Questo consente l'ottimizzazione che stai chiedendo circa.

Per inciso, ci può essere una leggera ambiguità, almeno localmente all'interno di quella parte dello standard. La definizione di stringa letterale non abbastanza rendere chiaro per me se il codice seguente utilizza una stringa letterale due volte, o due stringhe letterali una volta ogni:

const char *a = "";
const char *b = "";

Ma il prossimo paragrafo dice: "In fase di traduzione 6 adiacenti strette stringhe vengono concatenate". A meno che non significa dire che qualcosa possa essere adiacente a se stesso, credo che l'intenzione è abbastanza chiaro che questo codice utilizza due stringhe letterali, che sono concatenati in fase di 6. Quindi non è una stringa letterale due volte:

const char *c = "a" "a";

Ancora, se avete letto "a" e "a" sono il stesso stringa letterale, quindi il principio richiede l'ottimizzazione di cui stai parlando. Ma io non penso che siano la stessa letterale, penso che siano diverse letterali che accadono consistere degli stessi personaggi. Questo è forse chiarito altrove nello standard, per esempio nelle informazioni generali sulla grammatica e l'analisi.

Che si tratti di chiaro o no, molti del compilatore-scrittori hanno interpretato la norma il modo in cui penso che sia, quindi potrei anche avere ragione; -)

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