2012-11-26 2 views
6

Ho un sacco di stringhe letterali nel mio codice sorgente che sono identiche per il resto tranne che per gli spazi bianchi iniziali (a causa del desiderio di mantenere una indentazione corretta). I compilatori sono abbastanza intelligenti da vedere che può riutilizzare lo spazio in memoria per entrambi, semplicemente compensando una stringa di un paio di byte?Quando si consolidano i valori letterali duplicati, il compilatore C avrà un aspetto nel mezzo di una stringa?

+0

Vuoi dire, letterali con suffisso comune? –

+0

per favore aggiungi l'esempio di codice – SomeWittyUsername

+2

@Dvorak. Sì, se con ciò intendi una stringa è un suffisso di un'altra. Ex. "abc" e "___abc". – cleong

risposta

-4

Risposta semplice: No. Non conosco nessun compilatore che lo faccia.

+3

Si dovrebbe commentare questo, perché non è una risposta reale –

+0

Bene, la domanda era se ci sono alcuni compilatori che fanno questo tipo di pool di stringhe. Non c'è, questo è un dato di fatto, per quanto ne so. Potrebbero farlo, ma non lo fanno. Quindi cos'altro dovremmo commentare su questo? Che non varrebbe la pena lo sforzo? – TheBlastOne

+0

Ehi! Voglio un badge per 8 downvotes! E: perché i voti? :) – TheBlastOne

1

ISO c99 letterali 6.5.2.5 composti

83) Questo permette implementazioni di condividere archiviazione per stringhe e letterali composti costanti con uguali o sovrapposti rappresentazioni.

+0

Eh ?? I letterali composti non hanno nulla a che fare con i letterali stringa. Inoltre, le note del piede non sono testo normativo negli standard ISO. – Lundin

+0

davvero "le note del piede non sono testo normativo negli standard ISO" ".... io donno actully ho trovato questo un po 'significativo quindi ho appena risposto .. grazie per informazioni .. comunque dice di entrambi i letterali composti e stringhe – Omkant

+0

@ Lundin: Ho pensato a una risposta breve e concisa – Omkant

1

Risposta breve: probabilmente.

Risposta lunga: dipende dall'implementazione. In genere, i compilatori C dispongono di una funzione di ottimizzazione denominata "pool di stringhe" o simile, che consente al compilatore di memorizzare tutti i valori letterali di stringa adiacenti nella ROM.

Il contenuto di tale pool di stringhe può quindi essere ottimizzato, la stessa stringa che appare due volte quasi certamente verrà ottimizzata. Penso che la maggior parte dei compilatori sarà anche abbastanza intelligente da riconoscere le stringhe secondarie. Ma ci sono anche considerazioni sulla piattaforma come l'allineamento, quindi solo perché esiste una sottostringa, non significa necessariamente che sarà più efficace riutilizzare quella posizione di memoria.

Non c'è nulla nello standard C che garantisca che tali ottimizzazioni vengano eseguite. Ma allo stesso tempo, non c'è nulla nello standard che lo impedisca.

Per essere sicuro, è necessario controllare la documentazione specifica del compilatore, o disassemblare il programma, o controllare l'uscita del linker.