Оптимизируется ли тестирование для возвращаемого значения встроенной (шаблонной) функции, которая сама выполняет тестирование, до одного теста? - PullRequest
0 голосов
/ 28 сентября 2018

Допустим, у меня есть функция

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 будет оптимизирован.

1 Ответ

0 голосов
/ 28 сентября 2018

Проверяется ли возвращаемое значение встроенной (шаблонной) функции, которая сама выполняет тестирование, оптимизированной для одного теста?

Это можно оптимизировать дляодин тест, да.Фактически, оба ваших теста могут быть оптимизированы, так как значение тестируемого выражения может быть известно во время компиляции.Вся программа может быть оптимизирована для:

main:
        mov     eax, 1
        ret

Т.е. всегда возвращать 1 и больше ничего не делать.В последнем примере шаблона вместо этого возвращается 0, но в остальном он идентичен.


Тест не может быть оптимизирован вне функции fn, а проверка после вызова функции не может быть оптимизирована без возвратаЗначение функции может быть известно во время компиляции.Поэтому обязательным условием для объединения тестов является то, что оптимизатор должен иметь возможность расширять встроенный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...