Как можно сказать: возможно, что вызов функции окажется дороже, чем у вас сейчас. Конечно, громоздкие функции и повторение одного и того же кода делают для уродливого кода, который сложнее поддерживать и в результате: больше подвержено ошибкам.
Я лично рассмотрел возможность использования функции inline
, и пусть компилятор решит, должен ли код выполняться локально, или вызов функции действительно является лучшим вариантом.
Или, если хотите, вы могли бы просто использовать макрос.
inline
, как правило, считается лучшим вариантом, и, глядя на эти крошечные фрагменты кода, которые вы отправили, я бы сказал, что вы, вероятно, должны пойти на встроенные функции здесь.
Помните, что inline
оставляет его компилятору, чтобы решить, будет ли эта функция встроена или нет, поэтому, если после какого-то серьезного и репрезентативного тестирования вы чувствуете, что функция должна всегда быть встроенной, и вы с помощью GCC, вы можете использовать атрибут GCC always_inline
:
__attribute__((always_inline)) void your_inline_func(void *x, const char *y){}
Если ваш компилятор не может быть уговорили всегда встраивать функцию так легко, то вам придется вернуться к использованию макроса. Будьте внимательны: макрос не является безопасным по типу и может иметь побочные эффекты: тщательное тестирование является обязательным.
На основании 2 заявления вы размещены, один из способов сделать код более «данные-драйв» как размотки может быть предложено следующее:
const char *txt_argument;
//and for any other argument you might need, too:
EDITBOX *edit = NULL;
//possibly add SetState's arguments
switch(foo)
{
case bar:
txt_argument = Screen1_Editbox1_Text;
edit = (EDITBOX *)GOLFindObject(ID_Screen1_Editbox1);
break;
case zar:
txt_argument = "Text to output";
edit = (EDITBOX *)GOLFindObject(another_editbox);
break;
}
EbSetText(edit, txt_argument);
Это на самом деле не уменьшить количество кода у вас много, но это облегчает наблюдение за тем, что делает switch
.
Если вы изучаете способы (далее) оптимизировать это одно большое заявление switch
, тогда вы можете посмотреть nesting the switch
cases. Вполне возможно, что это малоэффективно, но для некоторых компиляторов, а в некоторых случаях это может изменить ситуацию.
Если у вас есть 120 случаев, попробуйте выяснить, не можете ли вы разбить их на 2 или 3 группы: те, которые очень распространены, те, которые вероятны, и те случаи, которые происходят редко. Наиболее распространенные случаи идут в основном switch
, тогда default
содержит еще один переключатель, в котором перечислены менее распространенные случаи, а по умолчанию там, в свою очередь, есть переключатель, который имеет дело с более редкими случаями.
Верстки, конечно, склонных к грязному коду, если вы хотите, вы можете заменить default: switch
немного просто с серией короткого switch
-es, с последующим возвращением ...
Может ли Macro быть полезной для вашей цели. –