Что будет эффективнее?

144
15 сентября 2019, 18:10

Имеем мы 8 функций:

void Function1() {}
...
void Function8() {}

И есть у нас переменная char, в которой есть как раз 8 бит.
Если, к примеру, в ней записано 10001011, то мы должны выполнить Function1, Function5, Function7, Function8.
Так вот, что же будет эффективнее по ресурсам и занимаемой памяти?

1) 8 if'ов:

void CallFunctions(char val) {
if(val & 1) {
Function1();
}
...
if(val & 0x80) {
Function8();
}
}

2) Инициализировать массив с указателями на функции, размером в 256 элементов:

std::function<void()> *ptrs; 

И вызывать каждую функцию по адресу val:

void CallFunctions(char val) {
ptrs[val]();
}

К примеру, по адресу ptrs[1] будет находиться функция, которая вызывает лишь Function1();
По адресу ptrs[3] уже будет находиться функция, которая вызывает Function1() и Function2() по очереди.
3) Ваш вариант.

Если второе, то как это сделать с минимальным выделением памяти?

Answer 1

3) сделать массив с 8 указателями и итеративно проходиться по нему:

using t_Method = void (void);
using t_Methods = ::std::array<t_Method *, 8>;
t_Methods const methods{&Function1, …};
auto flags{0b10001011u};
auto method_index{0u};
while(0u != flags)
{
   if(0u != (flags bitand 1u))
   {
       ::std::invoke(methods[method_index]);
   }
   flags >>= 1u;
   ++method_index;
}

online compiler

READ ALSO
C style cast в С и С++

C style cast в С и С++

C cast в С++ имеет следующую последовательность cast'ов:

125
c++ Vector сам перезаписывает значения в нём

c++ Vector сам перезаписывает значения в нём

Только начинаю пробовать векторы и не понимаю почему в нем изменяется значенияИспользую Qt 5

113
Иконка Файла Visual C++

Иконка Файла Visual C++

Как изменить иконку файлаVisual Studio C++ 2017

102