Допустим, у меня есть функция
bool inline fn(int a) {
if (a == 0) {
a = 1; //or some other computation
return true;
}
return false;
}
int main() {
int a = 0;
if (fn(a)) {
return 1;
}
}
, будет ли код main
приблизительно встроен в:
int a = 0;
bool test = false;
if (a == 0) {
a = 1; //or some other computation
test = true;
}
if (test) {
return 1;
}
, что приведет к двум ifs,ИЛИ скорее это будет выглядеть примерно так:
int a = 0;
if (a == 0) {
a = 1; //or some other computation
return 1;
}
, чего я, очевидно, хотел достичь.Здесь я использую функции не для того, чтобы сделать исполняемый файл меньше или чем-то еще, а просто для того, чтобы сделать код более читабельным.
Собственно, почему я делаю это, в следующем примере - представьте, что функция fn является шаблонной, так чтоЯ могу выбрать больше реализаций функции, в то время как функция вызывающей стороны демонстрирует общее поведение для всех своих экземпляров шаблона, делегируя определенные функции вызываемым функциям.
Опять же, это использование исключительно для повторного использования кода и его удобочитаемости.Функции будут вызываться / вставляться в одном месте в коде (то есть в base_function).
Я хочу знать, эффективно ли оптимизированы тесты на возвращаемые значения функций, поэтому этот метод повторного использования кода не 't вообще мешает исполнению / фактическому выполнению.
template<typename TagSwitch, typename ... Args>
void base_function(Args ... args) {
// some base behavior meant to be common to all functions "derived" from this function
if (do_end(TagSwitch(), args ...)) {
return;
}
//specific_behavior(TagSwitch(), args ...);
}
// default for all specific ("derived") functions is don't end
template<typename TagSwitch, typename ... Args>
bool inline do_end(TagSwitch, Args ... args) {
return false;
}
// here I define my specific ("derived") function
struct MySpecificFunctionTag {};
template<typename ... Args>
bool inline do_end(MySpecificFunctionTag, int a, Args ... args) {
if (a == 0) {
//Do something (set a parameter)
return true;
}
return false;
}
int main() {
base_function<MySpecificFunctionTag>(1);
}
Я хотел бы знать, если бы тест if (do_end(TagSwitch(), args ...)) {
в base_function<MySpecificFunctionTag>(1)
экземпляре привел бы к двум операциям if или one будет оптимизирован.