Как стать автором
Обновить
5
0

Пользователь

Отправить сообщение
Угол обзора камеры можно настроить. Camera Settings -> Field Of View. 90 градусов выставлено по умолчанию
2. Можно добавить проверку std::is_same<IA,T>
Да, Вы правы, ещё такой полиморфизм называют обобщённым программированием или статическим полиморфизмом
Да, действительно, результаты получаются похожими на Ваши. Добавил +rand() и вывод в лог непосредственно в helloFunction7. Значит, мой компилятор лучше оптимизирует код с шаблонами, а об виртуальные функции чаще спотыкается, раз такая разница была в первом случае
Согласен с Вами. Во втором случае компилятор действительно что-то подозрительно наоптимизировал. Но результат одинаковый. Сейчас разбираюсь в чём подвох. Я сам, честно говоря, ожидал разницы в 5-8 раз. Кстати, в Вашем примере всего один виртуальный метод. В моём же было 7
Сделал. Ситуация не поменялась
по-быстрому набросал пример.
const int sayHelloCount = 100000;
int counter = 0;

class IA {
public:
	virtual void helloFunction() = 0;
        ....
	virtual void helloFunction7() = 0;
};

class B : public IA {
public:
	void helloFunction() {
		counter++;
	}
        .....
	void helloFunction7() {
		counter--;
	}

};

void sayHello(IA* a) {
	for (int i = 0; i < sayHelloCount; i++) {
		a->helloFunction7();
	}
}


int main() {

	IA* a = new B;
	LARGE_INTEGER time_n, time_s;
	QueryPerformanceCounter(&time_s);
	sayHello(a);
	QueryPerformanceCounter(&time_n);
	auto difference = time_n.QuadPart - time_s.QuadPart;

	std::cout << difference;
	delete a;
	system("pause");
	return 0;
}


вывод:
672Для продолжения нажмите любую клавишу . . .


сравним с
const int sayHelloCount = 100000;
int counter = 0;

template <typename T>
class IA {
public:
	void helloFunction()	{
		static_cast<T*>(this)->helloFunction();
	};
        ....
	void helloFunction7() {
		static_cast<T*>(this)->helloFunction7();
	}
};

class B : public IA<B>
{
public:
	void helloFunction() {
		counter++;
	}
        ....
	void helloFunction7() {
		counter--;
	}

};

template <typename T>
void sayHello7(IA<T>* a) {
	for (int i = 0; i < sayHelloCount; i++) {
		a->helloFunction7();
	}
}


int main() {

	B *b = new B;
	LARGE_INTEGER time_n, time_s;
	QueryPerformanceCounter(&time_s);
	sayHello7(b);
	QueryPerformanceCounter(&time_n);
	auto difference = time_n.QuadPart - time_s.QuadPart;

	std::cout << difference;
	delete b;
	system("pause");
	return 0;
}

вывод:
1Для продолжения нажмите любую клавишу . . .

Возможно. Это моя первая статья. В дальнейшем буду иметь ввиду
*процедурному
1. Да, пропустил. Спасибо, поправил.
2. Да. Как выше писали, «это еще один способ выстрелить себе в ногу». Причём довольно легко и непринуждённо :)
На самом деле они только прочитали про механизм вызовов виртуальных функций и, привыкшие к функциональному программированию, решили что дело в нём, хотя это было совсем не так.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность