Mentre sfiorando il progetto di C++ 14/C++ 1A (n3690) ho notato che l'introduzione dei basic_string
suffissi litertal nella sezione §21.7:I letterali basic_string sono più veloci o gestiti meglio in fase di compilazione?
inline namespace literals {
inline namespace string_literals {
// 21.7, suffix for basic_string literals:
string operator "" s(const char *str, size_t len);
u16string operator "" s(const char16_t *str, size_t len);
u32string operator "" s(const char32_t *str, size_t len);
wstring operator "" s(const wchar_t *str, size_t len);
}
}
Le mie domande sono:
- C'è una possibilità di essere più veloce in fase di esecuzione con i valori letterali
basic_string
? - La mia implementazione "ingenua" è totalmente sbagliata?
- Il layout dei dati nella ROM può essere diverso con i valori letterali
basic_string
o qualsiasi altra differenza in fase di compilazione rispetto al tempo di esecuzione?
Sfondo
So che questo permette l'uso diretto di stringhe letterali come questo:
std::string s1 = "A fabulous string"s;
void sfunc(std::string arg);
int main() {
sfunc("argument"s);
}
Ma qual è il vantaggio di cui sopra basandosi su costruttore conversionestring(const char*)
?
Il codice "vecchio" apparirebbe:
std::string s1 = "A fabulous string"; // c'tor string(const char*)
void sfunc(std::string arg);
int main() {
sfunc("argument"); // auto-conversion via same c'tor
}
Per quanto posso vedere l'attuazione di operator "" s()
sarebbe sostanzialmente simile a questa:
std::string operator "" s(const char* lit, size_t sz) {
return std::string(lit, sz);
}
Così, proprio l'uso del lo stesso c'tor. E la mia ipotesi è, che deve essere fatto in fase di esecuzione, mi sbaglio?
Edit: Come Nicol Bolas sottolineato correttamente seguito il mio esempio non non usano lo stesso costruttore, ma quello con la lunghezza supplementare - che è molto utile per la costruzione, ovviamente. Questo mi lascia la domanda: è meglio per il compilatore inserire letterali stringa in ROM o qualcosa di simile in fase di compilazione?
Ottimo punto! Avere la lunghezza è un vantaggio, abbastanza sicuro. – towi
Per quanto riguarda le prestazioni, dubito che i letterali stringa daranno una spinta all'utilizzo di un const statico: 'static std :: string lit (" Literal ");'; potrebbero anche essere significativamente più lenti. Dover inventare un nome e dichiarare una variabile extra è un dolore, tuttavia, e le stringhe letterali sono definitivamente un miglioramento su queste basi. –