编译器如何管理返回内联函数?

时间:2017-03-02 08:14:01

标签: c++ function compiler-construction inline

假设我有一个内联函数,如this

inline double CalculateValue() {
    // some condition
    if (true) {
        // some other condition
        if (true) {
            // another condition
            if (true) {
                return 1.0;
            }

            // somethings
            std::cout << "inside1" << std::endl;
        }

        // somethings
        std::cout << "inside2" << std::endl;
    }

    return 2.0;
}

void Process() {
    double value = CalculateValue();

    value *= 100.0;

    std::cout << value << std::endl;
}

int main ()
{
    Process();
}

它会在CalculateValue()内复制并粘贴Process()个功能。结果是100,正如所料。

但如果我尝试emulate如何执行此“复制和粘贴”,我有些不明白的事情:

void Process() {
    double value;

    // some condition
    if (true) {
        // some other condition
        if (true) {
            // another condition
            if (true) {
                value = 1.0;
                return;
            }

            // somethings
            std::cout << "inside1" << std::endl;
        }

        // somethings
        std::cout << "inside2" << std::endl;
    }

    value = 2.0; 

    value *= 100.0;

    std::cout << value << std::endl;
}

int main ()
{
    Process();
}

当然,当它到达return语句时,必须忽略函数的其余部分(即inside1并且永远不能打印inside2),因为{{1} }。但是,如果来自父函数(return)的return,它会立即返回,因此我看不到Process()

这意味着它采取另一种方式。

编译器如何管理这种情况?我试图创建一个代码块,但100仍然返回主函数...

2 个答案:

答案 0 :(得分:2)

在编写“仿真”时,您忘记处理其中一个return。在内联函数中,编译器会用goto语句替换它。

void Process() {
    double value;

    // begin of inlined function

    // some condition
    if (true) {
        // some other condition
        if (true) {
            // another condition
            if (true) {
                value = 1.0;
                goto next;     // <<<<<<<<<<<<<<<<<<<  return replaced by goto
            }

            // somethings
            std::cout << "inside1" << std::endl;
        }

        // somethings
        std::cout << "inside2" << std::endl;
    }

    value = 2.0; 
 next:   
    //end of inlined function

    value *= 100.0;

    std::cout << value << std::endl;
}

答案 1 :(得分:0)

在这种情况下,内联代码会将return更像goto,例如:

void Process() {
    double value;

    // some condition
    if (true) {
        // some other condition
        if (true) {
            // another condition
            if (true) {
                value = 1.0;
                goto nextStep;
            }

            // somethings
            std::cout << "inside1" << std::endl;
        }

        // somethings
        std::cout << "inside2" << std::endl;
    }

    value = 2.0; 

nextStep:

    value *= 100.0;

    std::cout << value << std::endl;
}

内联的过程不仅仅是“复制和粘贴”,结果代码必须在注入的代码中有意义。编译器可以根据需要自由地修改和优化内联代码,同时保持原始代码的语义