Bazen bir dizenin uzunluğunu bir sabitle karşılaştırmak gerekir. Örneğin
:Derleme zamanı "strlen()" etkili mi?
if (line.length() > 2)
{
// Do something...
}
Ama kodunda "sihirli" sabitleri kullanmaktan kaçınmak çalışıyorum.
Genellikle böyle kodu kullanın: Çünkü işlev çağrısı daha okunabilir, ancak verimli
if (line.length() > strlen("[]"))
{
// Do something...
}
. oldukça iyi kod üreten bir yayın oluşturma yılında
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...
}
(2008 VisualStudio):
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
Ve iyi bir şey derleyici dahil olmamasıdır
ben aşağıdaki gibi şablon işlevlerini yazdı ikili çıktıdaki "[]" dizesi.
Derleyici özel bir optimizasyon mu yoksa ortak bir davranış mı?
muhtemelen tüm dizi tipleri için bir şablon kullanabilir şey bu yalan: 'template size_t _lenof (const T (&) [N]) {N dönüş - 1; } ', örneğinizle aynı şekilde çalışmalıdır. –
@Evan Teran: İyi fikir, ancak bu işlevler '\ 0' sona erdirme nedeniyle yalnızca dizeler (char/wchar_t dizisi) için anlamlıdır. İşleviniz int [10] için çalışmak ve dönecektir 9 - Ben mantıklı olduğunu düşünmüyorum;) – Dmitriy
@Dmitriy: gerçekten –