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?

questionAnswers(4)

yourAnswerToTheQuestion