gpt4 book ai didi

c++ - 为什么在 "discrete statements"中多次扩展的内联函数中的局部变量可以有一组变量?

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:57 24 4
gpt4 key购买 nike

我正在阅读 Inside The C++ Object Model 并发现对内联函数扩展感到困惑。

In general, each local variable within the inline function must be introduced into the enclosing block of the call as a uniquely named variable. If the inline function is expanded multiple times within one expression, each expansion is likely to require its own set of the local variables. If the inline function is expanded multiple times in discrete statements, however, a single set of the local variables can probably be reused across the multiple expansions.

在这里,在离散语句中多次展开内联函数是什么意思,这怎么可能发生?任何人都可以提出一个具体的例子来应用它吗?

最佳答案

我在处理术语离散语句时遇到了一些麻烦(特别是因为它已被多次强调)。我试图找到类似明确定义(通过谷歌)的东西,但我找不到。因此,我决定按字面意思将其解读为一个陈述(在分离的意义上,离散)。

表示函数 inline 只是向编译器提示程序员希望将函数体直接插入每个“调用点”(而不是简单地调用函数)。实际上,编译器决定函数是否真的内联。 (它甚至可能在一个调用点内联,但在另一点变成函数调用。)如果使用宏而不是内联函数,则内联要求将被授予(因为宏扩展实际上就是文本替换) .当然,宏有很多内联函数没有的限制。其中之一是内联函数可能具有局部变量。

我做了一个合成的例子。它不是“准备生产”的代码,但希望有助于说明主题:

#include <iostream>

using namespace std;

inline int absValue(int a)
{
int mB = -a;
return a < 0 ? mB : a;
}

int main()
{
int value;
// use input to prevent compile-time computation
cout << "input: " << flush;
cin >> value;
// multiple usages of absValue()
cout << "value: " << value << endl
<< "absValue(value): "
<< absValue(value)
<< endl
<< "absValue(-value): "
<< absValue(-value)
<< endl;
// done
return 0;
}

第二个输出语句多次调用函数 absValue(),调用应该被内联。我想象它是这样的:

  // multiple usages of absValue()
cout << "value: " << value << endl
<< "absValue(value): "
<< {
int mB = -(value);
return (value) < 0 ? mB : (value);
}
<< endl
<< "absValue(-value): "
<< {
int mB = -(-value);
return (-value) < 0 ? mB : (-value);
}
<< endl;

此语句中出现了两次 mB。一方面,这是两个独立的局部变量。另一方面,它们可能在连续使用时共享堆栈上的相同存储空间。 (如果编译器优化引入某种代码重新排序,导致 absValue() 的第一次和第二次扩展交错,它们可能不会共享相同的存储。)

整个解释是理论上的。实际上,编译器希望将 mB 放入寄存器,甚至优化大部分代码。

我稍微摆弄了一下 godbolt进一步说明。最后,我必须承认它基本上证明了我上面的最后一段。

关于c++ - 为什么在 "discrete statements"中多次扩展的内联函数中的局部变量可以有一组变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45666879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com