Czasami konieczne jest porównanie długości struny ze stałą.
Na przykład:Czy "strlen()" w czasie kompilacji działa efektywnie?
if (line.length() > 2)
{
// Do something...
}
Ale staram się unikać stałych „magiczne” w kodzie.
Zwykle używam takiego kodu:
if (line.length() > strlen("[]"))
{
// Do something...
}
Jest bardziej czytelne, ale nie efektywne ze względu na wywołaniu funkcji.
pisałem funkcje szablonów następująco:
template<size_t N>
size_t _lenof(const char (&)[N])
{
return N - 1;
}
template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
return N - 1;
}
// Using:
if (line.length() > _lenof("[]"))
{
// Do something...
}
W kompilacji uwalniania (VisualStudio 2008) produkuje całkiem dobry kod:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
I dobre jest to, że kompilator nie obejmuje "[]" łańcuch na wyjściu binarnym.
Czy jest to optymalizacja specyficzna dla kompilatora, czy też jest to typowe zachowanie?
Prawdopodobnie możesz użyć jednego szablonu dla wszystkich typów tablic, coś w tym stylu: 'szablon size_t _lenof (const T (&) [N]) {return N - 1; } ', powinno nadal działać tak samo jak twój przykład. –
@Evan Teran: dobry pomysł, ale te funkcje mają sens tylko dla ciągów znaków (tablica char/wchar_t) z powodu kończenia '\ 0'. Twoja funkcja będzie działać dla int [10] i powrotu 9 - nie sądzę, że to ma sens;) – Dmitriy
@Dmitriy: rzeczywiście –