Podczas szumiące nad projektem C++ 14/C++ 1r (n3690) zauważyłem, aby wprowadzenie basic_string
litertal przyrostków w sekcji §21.7:Czy łańcuchy literowe basic_string są szybsze czy obsługiwane szybciej podczas kompilacji?
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);
}
}
moje pytania są:
- Czy istnieje możliwość bycia szybszym w czasie wykonywania z literami
basic_string
? - Czy moja "naiwna" implementacja jest całkowicie błędna?
- Czy układ danych w pamięci ROM może się różnić od literatury
basic_string
lub jakąkolwiek inną różnicę podczas kompilacji w czasie pracy?
Tło
wiem, że ta pozwala na bezpośrednie wykorzystanie napisowych takiego:
std::string s1 = "A fabulous string"s;
void sfunc(std::string arg);
int main() {
sfunc("argument"s);
}
Ale to, co jest zaletą, że w ciągu opierając się na konstruktora konwersjistring(const char*)
?
„Stara” kod będzie wyglądał:
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
}
O ile widzę realizacja operator "" s()
byłoby w zasadzie wyglądać następująco:
std::string operator "" s(const char* lit, size_t sz) {
return std::string(lit, sz);
}
Tak, tylko użycie ten sam c'tor. I przypuszczam, że to musi być zrobione w czasie wykonywania, czy jestem w błędzie?
Edit: W Nicol Bolas wskazał poprawnie poniżej mój przykład nie nie używać tego samego konstruktora, ale jeden z dodatkowej długości - co jest bardzo przydatne do budowy, oczywiście. Pozostaje mi pytanie: czy lepiej dla kompilatora umieszczać literały łańcuchowe w ROM, czy coś podobnego podczas kompilacji?
Bardzo dobry punkt! Posiadanie długości jest zaletą, z pewnością. – towi
Co do wydajności, wątpię, aby literały łańcuchowe dały impuls do używania statycznego const: 'static std :: string lit (" Literal ");'; mogą nawet znacznie wolniej. Konieczność wymyślenia nazwy i zadeklarowania dodatkowej zmiennej jest jednak trudna, a literały łańcuchowe są zdecydowanie poprawą z tych powodów. –