Иногда приходится сравнивать длину строки с константой.
Например:Является ли время компиляции "strlen()" эффективным?
if (line.length() > 2)
{
// Do something...
}
Но я стараюсь не использовать «волшебные» константы в коде.
Обычно я использую такой код:
if (line.length() > strlen("[]"))
{
// Do something...
}
Это более удобным для чтения, но не эффективным из-за вызова функции.
Я написал шаблон функции следующим образом:
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...
}
В сборки выпуска (VisualStudio 2008) он производит довольно хороший код:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
И хорошо, что компилятор не включает Строка "[]" в двоичном выходе.
Является ли это конкретной оптимизацией для компилятора или это обычное поведение?
Возможно, вы можете использовать один шаблон для всех типов массивов, что-то ложь: 'template size_t _lenof (const T (&) [N]) {return N - 1; } ', все равно будет работать так же, как ваш пример. –
@Evan Teran: хорошая идея, но эти функции имеют смысл только для строк (массив char/wchar_t) из-за завершения «\ 0». Ваша функция будет работать для int [10] и вернуться 9 - я не думаю, что это имеет смысл;) – Dmitriy
@ Dmitriy: действительно –