2013-07-28 9 views
14

Come noto, le stringhe C-like vengono mantenute nella memoria statica come un'unica istanza. Ad esempio, ho ottenuto sia true su gcc 4.6 nell'esempio seguente. Ma mi chiedo è sempre vero e può essere portatile. Il comportamento su entrambi C e C++ è interessante.Le stringhe nelle istanze di memoria statica contano

#include <iostream> 

bool amIportable(const char* value) { 
    const char* slocal = "Hello"; 
    return (slocal==value); 
} 

int main() { 
    const char* s = "Hello"; 
    std::cout << std::boolalpha 
      << amIportable(s) << '\n' 
      << amIportable("Hello") << '\n'; 
} 

risposta

12

No, questo non è sempre vero, né è portatile.

L'unione di stringhe letterali identiche è un'ottimizzazione eseguita dal compilatore e dal linker che lavorano insieme. Le versioni recenti sia di GCC che del compilatore di Microsoft supportano entrambi, ma solo quando vengono impostati determinati parametri di ottimizzazione.

E non è solo una funzione "on" o "off". Diversi compilatori e diverse impostazioni di ottimizzazione influenzeranno anche il modo in cui in modo aggressivo viene eseguito. Ad esempio, a volte le stringhe letterali sono raggruppate solo nell'ambito di una singola funzione, altre volte al livello dell'unità di traduzione e altre volte il linker potrebbe essere coinvolto per eseguirlo su più unità di traduzione.

Ciò è consentito perché gli standard C e C++ lasciano questo comportamento come dipendente dall'implementazione.

9

No, dipende dall'implementazione sia per C che per C++.

C11 §6.4.5/7 Le stringhe

È specificato se queste matrici sono distinti fornito loro elementi hanno i valori appropriati. Se il programma tenta di modificare tale array, il comportamento non è definito.

C++ 11 §2.14.5/12 Le stringhe

Se tutte stringhe distinti (cioè, vengono memorizzate in oggetti sovrapposti) è definito dall'implementazione. L'effetto del tentativo di modificare una stringa letterale non è definito.

2

Ma mi chiedo è sempre vero

No, almeno lo standard C dice qualcosa come "se due identiche stringhe letterali sono memorizzati nello stesso array è definito dall'implementazione".

2

Si stanno confrontando due diversi valori letterali stringa, che corrispondono a hanno lo stesso valore. Secondo lo standard C++, è l'implementazione definita se letterali stringa identici occupano la stessa memoria o meno (il che significa che l'implementazione deve documentare ciò che fa); secondo lo standard C, è non specificato. (Suppongo che lo standard C++ consenta all'implementazione di documentare qualcosa sulla falsariga di "stringhe di contenuto identico condividono la stessa istanza se sono nella stessa unità di traduzione e non condividono la stessa istanza in caso contrario.)

Se il vostro obiettivo è quello di essere in grado di confrontare solo i puntatori, la solita soluzione di è quello di utilizzare una funzione (statico se si tratta di un membro della classe) che restituisce la stringa letterale:

char const* 
value() 
{ 
    return "Hello"; 
} 

bool 
isHello(char const* str) 
{ 
    return str == valule; 
} 

e quindi assicurarsi che tutte le istanze della stringa siano ottenute da chiamando value().

Problemi correlati