2013-10-10 15 views
7

Per esempio, se si dispone di un programma diLo standard C++ garantisce che i valori letterali stringa siano memorizzati nel programma binario non adulterato?

int main() 
{ 
    const char* str = "1111111111111111111111111111111111111111111"; 
    printf("%s", str); 

    return 0; 
} 

e si compila, se si cerca il binario generato per "1111111111111111111111111111111111111111111", (ignorando questioni come la codifica), siete garantiti per trovare, o è è consentito al compilatore di generare codice che, ad esempio, assegna memoria heap, lo riempie con "1" utilizzando un ciclo e quindi corregge tutti i riferimenti a quella stringa letterale per puntare alla memoria heap? (e poi assicura che venga deallocato al momento giusto, bla bla)

Dubito che ci sia qualche implementazione che in realtà faccia questo ... ma sarebbe conforme agli standard se lo facesse?

+0

Nulla lo garantisce. L'unica cosa che lo standard (sto osservando in una bozza di lavoro del 2005 dal momento che nessuno è senza soldi per il libro di testo ...) è il contenuto di stringhe letterali (siano esse strette o larghe), il loro tipo, la loro durata di archiviazione , sequenze di escape e concatenazione di stringhe letterali adiacenti. Vedi [2.13.4 qui] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf). –

risposta

10

C++ non ha alcun concetto di "programma binario", quindi la domanda non ha molto senso.

La garanzia è quella di ottenere tutti i caratteri nella stringa incrementando e dereferenziando il puntatore str, ad esempio la stringa viene memorizzata in modo contiguo nella memoria quando il programma è in esecuzione.

+2

E quella garanzia è fatta solo * se * lo fai effettivamente (o piuttosto che il compilatore non può provare, fino a un comportamento indefinito, non lo hai fatto), secondo la regola as-if. Cosa succede quando (diciamo) un programma esterno esamina la memoria del tuo eseguibile non definita dallo standard C++. – Yakk

0

Non penso ci sia alcuna buona ragione per un compilatore per farlo invece di codificarlo all'interno del programma compilato.

1

No, lo standard non indica dove e come viene memorizzata la stringa letterale. Questo è un dettaglio di implementazione.

+0

@Fabrizio Cosa intendi? Non verrà mai memorizzato in std :: vector –

+0

@Fabrizio: sono solo array. È come 'foo (" Ciao ");' sono stati sostituiti con 'foo (__ literal0)', dove 'static const char __literal0 [] = {'H', 'i', '\ 0'};'. – GManNickG

1

Ciò dipenderebbe dal compilatore e dall'architettura del computer per il quale il codice è stato compilato. Lo standard C++ non influisce sul modo in cui il codice viene memorizzato nel suo formato binario.

3

La memorizzazione binaria non è influenzata dallo standard C++

Problemi correlati