слышал, что этим увлекаться не стоит, якобы switch эффективнее.
В сети есть обсуждение, switch действительно чаще работает быстрее, но обычно никто не пишет if (i==0) {} else if (i==1) {} else if (i==2) {} ... Эта запись тоже странная:
u16 ( *( read_word() ) )(u32 address)
{
switch(cart->busType) {
case 0: return read_word_rom;
case 1: return read_swapped_word_rom;
...
Сложно читать что возвращается, обычно пишут typedef для указателя на функцию, чтобы заменить на "Func read_word()". И я бы заменил на массив функций, чтобы записать Func read_word() { return func_arr[cart->busType]; }. Или можно просто делать нужный вызов void read_word(u32 address) { switch(cart->busType) { case 0: read_word_rom(address); ... }}, или, если нужны указатели на функции использовать func_arr[cart->busType], а обычный вызов - void read_word(u32 address) { func_arr[cart->busType](address); }, тогда вызов read_word() без доп. скобок.
может кто-нибудь здесь знает такого разработчика YandereDev? Слышал, что причина тормознутости его игры как раз в том, что он злоупотребляет if-else.
Там вообще Unity, а значит Mono (вероятно C#). Увидел запись по поводу Yandere Simulator, что проблема в if else, но смысл не в замене на switch (что можно только в определённых случаях), а что там вообще не должно быть проверок. Т. е. проблема на уровне алгоритмов. Этот говнокодер не заслуживает внимания.
Не смотря на предостережения от Sharpnull, все-таки решил убрать return и break из case 2.
Это конечно работает, но запутанно и ведёт к ошибкам.
нашел ошибку в ID.h - в case MACRONIX_ID автор забыл break
Как я писал, частая ошибка. Там же char* manufactur = (char*)malloc(sizeof(char) * 12);, но ниже manufactur = "Alliance"; в getManufacturByID(), т. е. зачем-то выделяется память без очищения (free()) и указатель на неё теряется после вызова getManufacturByID(). Этот баг не проявится, т. к. утечка один раз за работу программы, а после завершения программы память возвращается.
UPD:
Плюс ко всему, надо еще придумать, как программа будет перебирать их все.
Идентификаторы можно записать в массив и перебирать - медленно, но просто. Вместо кучи switch, можно использовать словари (std::unordered_map) или множества (std::set), которые быстро находят элемент или позволяют проверить наличие элемента. Также есть простой вариант с массивами: например, у нас id от 0 до 255, определяем массив:
const char* arr[] = {
/* 00 */ "ID00"
/* 01 */ , "ID01"
...
/* FF */ , "IDFF"
};
Тогда простая инструкция быстро даёт значение по ключу: str = arr[id]. Это
https://en.wikipedia.org/wiki/Lookup_table.