- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
namespace markup
{
// case sensitive string equality test
// s_lowcase shall be lowercase string
inline bool equal(const char* s, const char* s1, size_t length)
{
switch(length)
{
case 8: if(s1[7] != s[7]) return false;
case 7: if(s1[6] != s[6]) return false;
case 6: if(s1[5] != s[5]) return false;
case 5: if(s1[4] != s[4]) return false;
case 4: if(s1[3] != s[3]) return false;
case 3: if(s1[2] != s[2]) return false;
case 2: if(s1[1] != s[1]) return false;
case 1: if(s1[0] != s[0]) return false;
case 0: return true;
default: return strncmp(s,s1,length) == 0;
}
}
...
почти все компиляторы уже умеют это делать автоматом - и лучше.
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#Other-Builtins
то что ты видишь в говнокоде сверху, это то что будет сделано самим компилятором на стадии компиляции(!!) - но не всегда, а только если данная оптимизация вызова strncmp() имеет смысл. и она имеет смысл только если входной параметр длина есть константа и эта константа достаточно мелкая. Если параметр длины есть переменная, inline ГК сверху насрет кучи лишнего кода в объектные файлы снижая эффективность кэша кода.
"Many of these functions are only optimized in certain cases; if they are not optimized in a particular case, a call to the library function will be emitted." сказано про константы и ее размер?
Не спорю, что это может быть действительно так, но в указанной статье об этом не сказано.
Это же не значит, что нужно так писать.
Не хотел бы я разбирать программы, написанные компилятором
Что вы хотели этим сказать?
При length<=0 будет жопа :)
при нуле будет тру вне зависимости от строк
при отрицательных значениях - смотри исходник strncmp, и то, только
если у вас получится засунуть в sizte_t (unsigned integral) отрицательное значение. энивей it's fun.
Мысли надо выражать чОтче :)
А то ребус, понимаешь, какой-то.
лол
Так и должно быть. В strncmp() по крайней мере.
А предложенная "оптимизация" будет сбоить.
А что не так при length == 0 ?
Для length < 0 не проверялось, ибо unsigned. Кстати, например, -2 вполне сойдёт за 4294967294, при этом strncmp() не зайдёт дальше конца самой короткой строки.
s1[-1] != s[-1] или
s1[4294967295] != s[4294967295] для unsigned
int main(void) {
const char* alpha = "bla-bla";
const char* beta = "bla-bla";
//fun starts here
cout << alpha[111] << endl;
cout << beta[111] << endl;
return 0;
}
$ g++ cCh.cpp
$ ./a.out
}
?
/* $OpenBSD: strncmp.c,v 1.7 2005/08/08 08:05:37 espie Exp $ */
int
strncmp(const char *s1, const char *s2, size_t n)
{
if (n == 0)
return (0);
do {
if (*s1 != *s2++)
return (*(unsigned char *)s1 - *(unsigned char *)--s2);
if (*s1++ == 0)
break;
} while (--n != 0);
return (0);
}
строки перебираются сначала, не с конца или середины. поэтому желанного s1[4294967295] не будет. а жаль.
Так и до переполнения в минус недалеко.
Хотя скорее будет Access violation.
Ну и последний ретурн вообще какой-то убогий.
на if( length == 0 ) return true; если size_t есть unsigned.
Ну, или внести условие в следующий if.
Если найдете ошибку - напишите.