ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #51  
Старый 23.06.2009, 12:17
Roston
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме:
2866942

Репутация: 350
Отправить сообщение для Roston с помощью ICQ
По умолчанию

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
 
Ответить с цитированием

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

Репутация: 930


По умолчанию

Верно
 
Ответить с цитированием

  #53  
Старый 23.06.2009, 13:19
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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 раза больше по коду и следовательно по скорости.

Из этого можно сказать что при работе со строковыми функциями лучше использоват собственные методы
 
Ответить с цитированием

  #54  
Старый 23.06.2009, 13:21
Lee_fx
Познающий
Регистрация: 27.09.2008
Сообщений: 57
Провел на форуме:
265628

Репутация: 23
По умолчанию

Цитата:
Как можно выполнить эффективное побайтовое сравнение структур, не используя прагмы компилятора и группировку членов?
memset, memcmp?
 
Ответить с цитированием

  #55  
Старый 23.06.2009, 14:31
desTiny
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
 
Ответить с цитированием

  #56  
Старый 23.06.2009, 15:16
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

Lee_fx, подробнее )
 
Ответить с цитированием

  #57  
Старый 23.06.2009, 17:18
Lee_fx
Познающий
Регистрация: 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яем и сравниваем.
 
Ответить с цитированием

  #58  
Старый 23.06.2009, 17:22
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

Точно )
Нерешенные задачи: 2 9 10 13 14

Последний раз редактировалось Fata1ex; 23.06.2009 в 17:25..
 
Ответить с цитированием

  #59  
Старый 23.06.2009, 22:18
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Мне вот еще нравилась старая задачка одна, которая даже не зависела от языка программирования.
А Задачка такая:
Есть 2 числа
int a = 12;
int b = 7;

необходимо обменять значения между этими переменными при этом нельзя использовать третью переменную.
P.S. числа роли не играют.
 
Ответить с цитированием

  #60  
Старый 23.06.2009, 22:34
[n]-c0der
Участник форума
Регистрация: 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)
 


Быстрый переход




ANTICHAT.XYZ