A veces es necesario comparar la longitud de una cuerda con una constante.
Por ejemplo:¿Es eficaz el tiempo de compilación "strlen()"?
if (line.length() > 2)
{
// Do something...
}
Pero estoy tratando de evitar el uso de constantes "mágicas" en el código.
Por lo general utilizan dicho código:
if (line.length() > strlen("[]"))
{
// Do something...
}
Es más fácil de leer, pero no es eficiente debido a la llamada a la función.
escribí funciones de la plantilla de la siguiente manera:
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...
}
En una versión de lanzamiento (VisualStudio 2008) que produce bastante bueno código:
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
Y lo bueno es que el compilador no incluye la "[]" cadena en la salida binaria.
¿Es una optimización específica del compilador o es un comportamiento común?
es probable que pueda usar una plantilla para todos los tipos de matriz, algo mienta esto: 'plantilla tamaño_t _lenof (const T (&) [N]) {return N - 1; } ', debería funcionar igual que en tu ejemplo. –
@Evan Teran: buena idea, pero estas funciones solo tienen sentido para las cadenas (matriz de char/wchar_t) debido a la terminación '\ 0'. Su función funcionará para int [10] y devolverá 9 - No creo que tenga sentido;) – Dmitriy
@Dmitriy: de hecho –