Волшебный способ заставить :: базовый класс (например, Animal) знать класс своего НАСТОЯЩЕГО самовыводимого экземпляра (C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Волшебный способ заставить :: базовый класс (например, Animal) знать класс своего НАСТОЯЩЕГО самовыводимого экземпляра (

Сообщение Anonymous »

Мне нужно преждевременно провести оптимизацию, чтобы повысить производительность вызова виртуальных функций.

Код: Выделить всё

Animal::f1(int)
— виртуальная функция. Он реализован многими классами, например. Собака, и Murderous_Hippo.
В реальном мире f1() используется как обратный вызов с высокой нагрузкой на процессор.
т.е. f1() всегда вызывается из базового класса Animal, а не из производных классов.

например. животное->f1(что-то), а не собака->f1(что-то)
Из профилирования, вызываю животное->f1 (int) часто бывает очень медленно. вызывается во многих местах моего кода, но узкое место возникает только там, где он вызывается в таком узком цикле.

Код: Выделить всё

for(Animal* animal : allAnimalInTheWorld){
for(int i : intArraySizeAround1000){
animal->f1(i);
}
}
Обходной путь 1 (быстрый, но сложный в обслуживании)
Мое плохое решение для его улучшения — зарегистрировать обратный вызов как массив, принимающий функцию.< /p>
Вот псевдокод:

Код: Выделить всё

class Animal{
public: virtual void f1(int)=0;
public: std::function f2;
public: template void regg{
f2=[&](const std::vector& v){   ///f1(i);   ///f2(vector_of_int);
Однако эту практику очень сложно поддерживать.
Каждый производный класс, например Собака, и Murderous_Hippo должны не забыть самостоятельно зарегистрировать ().
Обходной путь 2 («вывести это» — не работает)
Вот еще одна попытка использования «вывода этого».
Полагаю, это не так. работает, потому что конструктор Animal не знает, что сам Собака пока.
Вот MCVE (богболт).

Код: Выделить всё

#include 
#include 
class Animal{
public: virtual void f1(int)=0;
public: std::function f2;

///: "deducing this" technique (not work in this case)
public:  template  void myReg(this Self&& self)   {
std::cout

Подробнее здесь: [url]https://stackoverflow.com/questions/79263650/magic-way-to-make-base-e-g-animal-class-know-class-of-its-real-self-derive[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»