ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

23.06.2009, 12:17
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
15)
2 3 2
Обьяснение:
перечисления... если б Х ничего не присваивалось тогда бы вывод значения был бы в зависимости от расположения переменной и каждое следуещее значение инкрементировалось на 1, тобишь если б
Код:
enum {x,y,z}
cout<<x<<" "<<y<<" "<<z;
то результат быд 0 1 2
а так Х=1+1, тогда Y=x+1=3; z=x=2
|
|
|

23.06.2009, 12:29
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Верно 
|
|
|

23.06.2009, 13:19
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Fata1ex в моё случае экономия времяни идет раза в 2 потому как strlen - проходит и сравнивате каждый символ с нулем. Так что если юзать strlen то это двойной проход строки. Для доказательства всег овышеслудующего приведу ассемблерный код который созддает компилятор MS
случай
Код:
int a = 0;
char * k = str;
while (k[0])
{
a += k[0];
k++;
}
Код:
; int a = 0;
xor edx, edx
mov BYTE PTR _str$[esp+10], cl
mov WORD PTR _str$[esp+8], ax
; char * k = str;
lea ecx, DWORD PTR _str$[esp+8]
; while (k[0])
test al, al
je SHORT $LN1@main
$LL2@main:
; a += k[0];
movsx eax, al
; 24 : k++;
inc ecx
add edx, eax
mov al, BYTE PTR [ecx]
test al, al
jne SHORT $LL2@main
$LN1@main:
Итого 31 байт.
А теперь рассмотрим код в случае
Код:
int k=0,A=0,n=strlen(str);
for(k=0;k<n;k++)
A+=str[k];
выходит
Код:
00024 8d 44 24 10 lea eax, DWORD PTR _str$[esp+20]
00028 83 c4 04 add esp, 4
0002b 88 4c 24 0e mov BYTE PTR _str$[esp+18], cl
0002f 33 db xor ebx, ebx
00031 8d 50 01 lea edx, DWORD PTR [eax+1]
$LL11@main: /// <== вот это типа код strlen==========
00034 8a 08 mov cl, BYTE PTR [eax]
00036 40 inc eax
00037 84 c9 test cl, cl
00039 75 f9 jne SHORT $LL11@main
/// <=========================================
0003b 2b c2 sub eax, edx
0003d 8b d0 mov edx, eax
; 23 :
; 24 : for(k=0;k<n;k++)
0003f 33 c0 xor eax, eax
00041 83 fa 02 cmp edx, 2
00044 7c 20 jl SHORT $LC9@main
00046 8d 4a ff lea ecx, DWORD PTR [edx-1]
00049 55 push ebp
0004a 8d 9b 00 00 00
00 npad 6
$LL10@main:
; 25 : A+=str[k];
00050 0f be 6c 04 10 movsx ebp, BYTE PTR _str$[esp+eax+20]
00055 03 f5 add esi, ebp
00057 0f be 6c 04 11 movsx ebp, BYTE PTR _str$[esp+eax+21]
0005c 83 c0 02 add eax, 2
0005f 03 fd add edi, ebp
00061 3b c1 cmp eax, ecx
00063 7c eb jl SHORT $LL10@main
00065 5d pop ebp
$LC9@main:
; 23 :
; 24 : for(k=0;k<n;k++)
00066 3b c2 cmp eax, edx
00068 7d 05 jge SHORT $LN8@main
; 25 : A+=str[k];
0006a 0f be 5c 04 0c movsx ebx, BYTE PTR _str$[esp+eax+16]
$LN8@main:
0006f 03 fe add edi, esi
выходит 77 байт.
что выходит почти в 2,5 раза больше по коду и следовательно по скорости.
Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
|
|
|

23.06.2009, 13:21
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Как можно выполнить эффективное побайтовое сравнение структур, не используя прагмы компилятора и группировку членов?
memset, memcmp?
|
|
|

23.06.2009, 14:31
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от slesh
что выходит почти в 2,5 раза больше по коду и следовательно по скорости.
следование неверно)
@here: mov ecx, 10;
loop @here;
вообще несколько байт) а time = \infty
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

23.06.2009, 15:16
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Lee_fx, подробнее )
|
|
|

23.06.2009, 17:18
|
|
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме: 265628
Репутация:
23
|
|
Код:
struct A {
int x;
char y;
};
int main() {
A a, b;
memset(&a, NULL, sizeof(a));
memset(&b, NULL, sizeof(b));
a.x = 10; a.y = 'q';
a.x = 10; a.y = 'q';
if(memcmp(&a, &b, sizeof(a)))
cout << "!=";
else
cout << "=";
return 0;
}
sizeof(a) и sizeof(b) - 12 байт, хотя int+char = 5 => остальные 7 занимает мусор, его и заNULLяем и сравниваем.
|
|
|

23.06.2009, 17:22
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Точно )
Нерешенные задачи: 2 9 10 13 14
Последний раз редактировалось Fata1ex; 23.06.2009 в 17:25..
|
|
|

23.06.2009, 22:18
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Мне вот еще нравилась старая задачка одна, которая даже не зависела от языка программирования.
А Задачка такая:
Есть 2 числа
int a = 12;
int b = 7;
необходимо обменять значения между этими переменными при этом нельзя использовать третью переменную.
P.S. числа роли не играют.
|
|
|

23.06.2009, 22:34
|
|
Участник форума
Регистрация: 03.02.2009
Сообщений: 104
Провел на форуме: 270228
Репутация:
70
|
|
Сообщение от slesh
Мне вот еще нравилась старая задачка одна, которая даже не зависела от языка программирования.
А Задачка такая:
Есть 2 числа
int a = 12;
int b = 7;
необходимо обменять значения между этими переменными при этом нельзя использовать третью переменную.
P.S. числа роли не играют.
ASM xchg...
Ну и собсна алгоритм:
Код:
a = a - b;
b = b + a;
a = b - a;
Реализация  :
Код:
procedure _XCHG(var a,b:integer);
Begin
a:= a - b;
b:=b + a;
a:=b - a;
End;
Код:
void _XCHG(int a, int b){
a = a - b;
b = b + a;
a = b - a;
};
Последний раз редактировалось [n]-c0der; 23.06.2009 в 22:51..
|
|
|
|
 |
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
[PHP] ЗАДАНИЯ от Krist_ALL
|
Krist_ALL |
PHP, PERL, MySQL, JavaScript |
205 |
30.11.2009 18:31 |
|
Задания
|
~Fenix~ |
Болталка |
11 |
13.05.2006 11:03 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|