Czy czas kompilacji „strlen ()” jest skuteczny?
Czasami konieczne jest porównanie długości łańcucha ze stałą.
Na przykład:
if ( line.length() > 2 )
{
// Do something...
}
Ale staram się unikać używania „magicznych” stałych w kodzie.
Zazwyczaj używam takiego kodu:
if ( line.length() > strlen("[]") )
{
// Do something...
}
Jest bardziej czytelny, ale nie wydajny z powodu wywołania funkcji.
Napisałem funkcje szablonu w następujący sposób:
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 wersji do wydania (VisualStudio 2008) generuje całkiem niezły kod:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
Dobrą rzeczą jest to, że kompilator nie zawiera łańcucha „[]” na wyjściu binarnym.
Czy jest to optymalizacja specyficzna dla kompilatora, czy jest to typowe zachowanie?