测试本身是测试的内联(模板)函数的返回值是否针对一种测试进行了优化?

时间:2018-09-28 12:29:32

标签: c++ templates optimization

假设我有一个功能

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)中调用/内联。

我想知道,是否有效地优化了对函数返回值的测试,因此这种代码重用技术根本不会干扰性能/实际执行。

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或一个将被优化。

1 个答案:

答案 0 :(得分:1)

  

是否正在测试内联(模板化)函数的返回值(它本身就是测试),并且针对一项测试进行了优化?

可以将 优化为一项测试,是的。实际上,您可以对两个测试进行优化,因为可以在编译时知道被测试表达式的值。整个程序可以优化为:

app.use(postgraphile(...));
app.use(jwt(...));
app.use(...);

即始终返回1,什么也不做。后者的模板示例返回0,但在其他方面相同。


无法从函数main: mov eax, 1 ret 中优化测试,并且不能优化函数调用后的检查,除非可以在编译时知道函数的返回值。因此,将测试合并到一个测试中的前提条件是优化器必须能够内联扩展调用。