więc podczas łączenia ciągów, często nie są stałe elementy, na przykład:Szybsze stały Dołączanie ciąg bez makro
std::string s;
s += initial_string;
s += "const string";
s += terminating_string;
To tylko demonstracja, operacje strun może być trochę bardziej skomplikowane i szczegółowe. Tak więc, podczas wykonywania części stałej, implementacja kończy się "niewiedzą" o długości i skutecznie działa na niej strlen()
. Oczywiście jest to marnotrawstwo, ponieważ długość jest znana podczas kompilacji. Przetestowałem, że zastąpienie const część ciąg z tym jest trochę szybciej (znacznie bardziej x64 z jakiegokolwiek powodu):
s.append("const string",12);
To denerwujące, czasochłonne i podatne na błędy faktycznie policzyć znaki , więc jest trochę lepiej:
s.append("const string",sizeof("const string")-1);
to wciąż nieco podatne na błędy (tj zmienić pierwszą część, ale zapomnij zmienić drugą część), więc makro może pomóc to:
#define strnsizeof(s) s,sizeof(s)-1
s.append(strnsizeof("const string"));
Pytanie 1: Czy ktoś ma lepsze/czystsze rozwiązanie tego problemu?
Mam również rozszerzoną klasę ciągów, w której używam operatora <<
do łączenia ciągów i różnych innych typów obiektów. Podobny problem tutaj, to jest ładne i czyste (dla mnie):
s << initial_string << "const string" << terminating_string;
Kiedy mam operator dla własnego typu obiektu (którego długość jest składnikiem) operacja append jest szybkie i łatwe, ale kiedy go ponownie dostaje const char *
, nie dostaję długości, mimo że jest stała w czasie kompilacji. Więc mogę przyspieszyć że się tworząc mały strukturę, która pobiera const char *
i długość wzdłuż linii:
s << initial_string
<< MyStr::ConstBuf(strnsizeof("const string"))
<< terminating_string;
Boy jest to, że coraz brzydkie. Mogę więc również to zrobić, np .:
#define MyStrConst(s) MyStr::ConstBuf(s,sizeof(s)-1)
s << initial_string
<< MyStrConst("const string")
<< terminating_string;
Lepsze, ale nie świetne.
Pytanie 2: Czy ktoś ma lepsze/czystsze rozwiązanie niż hermetyzacja stałego ciągu?
Funkcja, która pobiera tablicę znaków według odwołania. –
Czy coś jest nie tak z 'std :: stringstream'? – dunc123
Być może brakuje mi czegoś w komentarzu do tablicy znaków ... jak uzyskać długość? na przykład 'void fn (char ar [])' Nie miałbym czasu na kompilację ... – mark