我应该通过引用或值将参数传递给内联函数吗?

新手上路,请多包涵

其中之一更快吗?

 inline int ProcessByValue(int i)
{
    // process i somehow
}

inline int ProcessByReference(const int& i)
{
    // process i somehow
}

我知道整数类型应该按值传递。但是,我担心编译器可能会内联 ProcessByValue 以包含副本。有这方面的规则吗?

原文由 rlbond 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 728
2 个回答

应根据对函数有意义的内容键入参数。

如果函数采用原始类型,则按值传递是有意义的。我认识的一些人会抱怨如果它被 const ref 通过(因为它是“不必要的”),但我认为我不会抱怨。如果函数采用用户定义的类型并且不修改参数,那么通过 const ref 传递将是有意义的。

如果它是用户定义的类型并且参数被修改,那么函数的语义将决定它应该如何传递。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 2.5 许可协议

这没什么区别。在这两种情况下,代码都将被内联。编译器将消除不必要地复制 int(按值传递),并且不必要地创建对 int 的引用,并在访问 int 时遵循该间接层,也将被消除。

您的问题似乎是基于一些错误的假设:

  • inline 关键字实际上会使您的函数内联。 (可能,但这当然不能保证)
  • 参考与值的选择取决于内联的函数。 (完全相同的性能考虑将适用于非内联函数)
  • 它有所作为,并且您可以通过像这样的微不足道的更改来超越编译器(编译器将在任何一种情况下应用相同的优化)
  • 并且优化实际上会在性能上产生可衡量的差异。 (即使没有,差异也会很小,可以忽略不计。)

我知道整数类型应该按值传递。但是,我担心编译器可能会内联 ProcessByValue 以包含副本。有这方面的规则吗?

是的,它会创建一个副本。就像通过引用传递会创建一个引用一样。然后,至少对于像 int 这样的简单类型,编译器会再次消除两者。内联函数不允许改变函数的行为。如果你创建函数来接受一个值参数,它的行为就好像它被赋予了一个值参数,不管它是否被内联。如果您将函数定义为获取引用,则无论它是否内联,它都会表现得好像传递了一个引用。所以做导致正确行为的事情。

原文由 jalf 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题