【问题标题】:C++ inline function, parameter passed by valueC++内联函数,参数传值
【发布时间】:2014-11-17 17:52:34
【问题描述】:

上次我检查了一个内联函数是一个函数,它的主体被直接替换在程序中调用该函数的每个点中。 所以当我这样做时:

#include <iostream>
inline void increment(int n) { n = n + 1; }`
int main() { 
   int n = 0;
   increment(n);
   std::cout << "Result " << n;
}

我应该有:结果 1。 相反,我得到 0。

那么内联函数是如何工作的呢?

【问题讨论】:

  • 一个函数无论是否内联,其逻辑行为都是相同的。
  • 通过引用传递。您增加参数的副本,并且在执行离开您的函数后副本消失。
  • 我知道我正在使用副本。我是故意的。我想看看我是否使用了内联函数,调用将直接替换为 n = n + 1。
  • @iman:会的,但是对于名为 n 的不同变量,而不是 main 中的变量。内联函数的行为与非内联函数完全相同。

标签: c++ inline pass-by-value


【解决方案1】:

'inline' 不像宏那样用函数体替换文本。它用 EQUIVALENT 生成的代码替换函数调用,因此在功能上它与非内联代码没有什么不同。

【讨论】:

  • 问题不在于函数的inline,而在于参数的传递方式。 OP 正在修改传递变量的 副本,而不是实际变量。
  • 问题是明确的“内联函数是如何工作的?”,而不是“我怎样才能让它修改 'n' 的值?”
【解决方案2】:

这不是内联的问题,而是方法签名错误:

inline void increment(int& n) {
  ++n;
}

你要一份,你得到一份。而是要求参考。不要将内联函数混淆,它们是不一样的。事实上,声明 inline 通常会适得其反,因为编译器会根据您的优化设置为您进行此调用。

【讨论】:

    【解决方案3】:

    内联时应考虑两件事。

    1) 内联只是对编译器的请求,而不是命令,用它的主体替换函数调用,以避免与函数调用相关的开销。

    2) 你应该总是内联像 getter/setter 这样非常小的函数。因为内联大型函数或递归函数会导致代码膨胀,这违背了内联的目的。

    内联函数也有静态链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多