Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Тесты для компилятора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Поменять местами минимальный и максимальный элемент массива V[25] и подсчитать количество парных элементов массива http://www.cyberforum.ru/cpp-beginners/thread33396.html
Поменять местами минимальный и максимальный элемент массива V и подсчитать количество парных элементов массива
C++ Указатели на функции-члены Вот есть класс class Base{ public: int GetAge(){return age;} private: int age; http://www.cyberforum.ru/cpp-beginners/thread33395.html
C++ Графика+Рекурсия
Помогите пожалуйста! Нужно нарисовать снежинку: 1) Вводим K,L,N 2) Из точки О рисуем 6 отрезков длиной L, угол между ними 60 (считаем это за 1 уровень) 3) И концов этих точек рисуем еще 5...
Ввод символов без нажатия Enter'а C++
Подскажите пожалуйста, как реализовать считывание символов (одного или нескольких) без нажатия Enter'а.
C++ Графика С++ http://www.cyberforum.ru/cpp-beginners/thread33346.html
знаю что с графикой можно (нужно) работать через Borland C++, но желания пересаживаться с Dev-Cpp нет. Подскажите, из знающих, как можно выводить на экран простую графику (ну тип как в qbasic'е -...
C++ файловый менеджер помогите пожауйста!!! задание: написать программу файловый менеджер. желательно на с++. какой нужен компонент и что прописать чтобы отобразить древо каталогов??? подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17808 / 6014 / 388
Регистрация: 30.03.2009
Сообщений: 16,527
Записей в блоге: 26
09.06.2009, 00:00
В исходном примере "for (char p*=massive;p!=0;p++) use (*p);" - ошибочный код, правильно было бы "for (char *p=massive;*p!=0;p++) use (*p);"

Чтобы проверить скорость работы - в посте #5 тебе расписали. Только вместо time надо использовать clock (почитай по нему документацию) - он мерит "чистое" время задачи (т.е. всякие системные задержки в это время включаться не будут)

"Стандартое" - написать программу в цикле и исполняемый файл запустить через утилиту time (если ничего не путаю) - она тебе покажет время исполнения. Но это будет время исполнения всей задачи, а не твоего фрагмента. Поэтому тебе нужно свой фрагмент исполнять в цикле большое количество раз. При этом нужно уметь писать код, чтобы в результате работы оптимизаций что-то не схлопнулось. Типа того, что если напишешь в цикле "a = 3 + 5", то у тебя не будет в цикле исполняться операция сложения, а будет просто иполняться присваивание "a = 8"

Поэтому качество кода следует оценивать глазами в ассемблерном файле:

C
1
2
3
4
5
6
7
8
extern void use (char);
void function_using_index(char massive[])
{
  int i;
  asm volatile ("------------");
  for (i=0;massive[i]!=0;i++) use (massive[i]);
  asm volatile ("------------");
}
Палки нарисовал для того, чтобы ввизуально проще было бы отличить "твой" код, от того кода, который компилятор должен построить в каждой процедуре

Для данного исходника без оптимизаций:

Код
$ gcc a.c -S -o a.s
$ cat a.s
...
	------------
#NO_APP
	movl	$0, -4(%ebp)
	jmp	.L2
.L3:
	movl	-4(%ebp), %eax
	addl	8(%ebp), %eax
	movzbl	(%eax), %eax
	movsbl	%al,%eax
	movl	%eax, (%esp)
	call	use
	addl	$1, -4(%ebp)
.L2:
	movl	-4(%ebp), %eax
	addl	8(%ebp), %eax
	movzbl	(%eax), %eax
	testb	%al, %al
	jne	.L3
#APP
	------------
...
Для данного исходника с оптимизациями:

Код
$ gcc -O2 a.c -S -o a.s
$ cat a.s
...
	------------
#NO_APP
	movzbl	(%edx), %eax
	testb	%al, %al
	je	.L2
	movl	%edx, %ebx
	.p2align 4,,7
.L4:
	movsbl	%al,%eax
	movl	%eax, (%esp)
	call	use
	movzbl	1(%ebx), %eax
	addl	$1, %ebx
	testb	%al, %al
	jne	.L4
.L2:
#APP
	------------
...
Даже если не разбираешься в ассембелер, то глазками его можно посмотреть. В обоих случаях есть операция "jne", которая делает условный переход назад на метку (образуя при этом цикл). Посчитай хотя количество операций в цикле - это даст хотя бы приблизительную оценку качества кода
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru