- 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;
}
}
...
vitaly 29.08.2010 18:10 # −4
Dummy00001 29.08.2010 19:29 # 0
почти все компиляторы уже умеют это делать автоматом - и лучше.
absolut 29.08.2010 19:38 # 0
Dummy00001 29.08.2010 19:47 # 0
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#Other-Builtins
absolut 29.08.2010 20:44 # 0
Dummy00001 29.08.2010 21:10 # 0
то что ты видишь в говнокоде сверху, это то что будет сделано самим компилятором на стадии компиляции(!!) - но не всегда, а только если данная оптимизация вызова strncmp() имеет смысл. и она имеет смысл только если входной параметр длина есть константа и эта константа достаточно мелкая. Если параметр длины есть переменная, inline ГК сверху насрет кучи лишнего кода в объектные файлы снижая эффективность кэша кода.
absolut 30.08.2010 06:55 # 0
"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." сказано про константы и ее размер?
Не спорю, что это может быть действительно так, но в указанной статье об этом не сказано.
Dummy00001 29.08.2010 21:12 # 0
Анонимус 30.08.2010 13:31 # +4
Это же не значит, что нужно так писать.
Не хотел бы я разбирать программы, написанные компилятором
absolut 29.08.2010 18:38 # +1
rat4 29.08.2010 18:53 # 0
Dummy00001 29.08.2010 19:35 # 0
absolut 29.08.2010 19:40 # 0
rat4 29.08.2010 19:57 # 0
Kornew 29.08.2010 18:51 # −1
Stalker 30.08.2010 13:01 # −1
da4ever 31.08.2010 06:24 # −1
absolut 31.08.2010 07:06 # +1
Что вы хотели этим сказать?
absolut 02.09.2010 07:21 # +1
При length<=0 будет жопа :)
da4ever 02.09.2010 07:50 # 0
при нуле будет тру вне зависимости от строк
при отрицательных значениях - смотри исходник strncmp, и то, только
если у вас получится засунуть в sizte_t (unsigned integral) отрицательное значение. энивей it's fun.
absolut 02.09.2010 09:21 # 0
Мысли надо выражать чОтче :)
А то ребус, понимаешь, какой-то.
da4ever 02.09.2010 09:34 # 0
лол
absolut 02.09.2010 09:25 # 0
Так и должно быть. В strncmp() по крайней мере.
А предложенная "оптимизация" будет сбоить.
da4ever 02.09.2010 09:38 # 0
Stalker 02.09.2010 12:07 # 0
А что не так при length == 0 ?
Для length < 0 не проверялось, ибо unsigned. Кстати, например, -2 вполне сойдёт за 4294967294, при этом strncmp() не зайдёт дальше конца самой короткой строки.
absolut 02.09.2010 12:47 # 0
s1[-1] != s[-1] или
s1[4294967295] != s[4294967295] для unsigned
Stalker 02.09.2010 13:01 # 0
absolut 02.09.2010 13:08 # 0
Stalker 02.09.2010 13:21 # 0
absolut 02.09.2010 14:06 # 0
da4ever 02.09.2010 23:48 # 0
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
}
?
da4ever 03.09.2010 00:11 # +1
/* $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] не будет. а жаль.
Govnoeb 01.09.2010 23:19 # −3
absolut 02.09.2010 07:25 # +2
Так и до переполнения в минус недалеко.
Хотя скорее будет Access violation.
Ну и последний ретурн вообще какой-то убогий.
absolut 02.09.2010 09:43 # −2
absolut 02.09.2010 12:51 # 0
на if( length == 0 ) return true; если size_t есть unsigned.
Ну, или внести условие в следующий if.
Если найдете ошибку - напишите.
Stalker 02.09.2010 13:07 # 0
absolut 02.09.2010 13:21 # 0
Govnoeb 16.09.2010 19:36 # 0
TheCalligrapher 04.09.2010 09:56 # −1