假设我有一个内联函数,如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
仍然返回主函数...
答案 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;
}
内联的过程不仅仅是“复制和粘贴”,结果代码必须在注入的代码中有意义。编译器可以根据需要自由地修改和优化内联代码,同时保持原始代码的语义