通过引用将变量传递给函数是否比使函数返回变量更有效?

洛根·克林(Logan Kling)

因此,这似乎是一个非常简单的问题,但我无法在任何在线位置找到答案。我假设返回变量的函数比接受变量并更改它的函数效率低,这是因为我认为第一个函数会使用更多的内存。但是,我可能是错的,我不知道这会如何影响处理时间。

这是两个C ++示例:这个函数返回一个变量:

#include <iostream>
short getInput(){
    short input;
    std::cin >> input;
    return input;
}
int main(){
    short input = getInput();
}

您可以在其中一个中看到该程序需要创建两个输入变量,即使仅在很短的时间内创建了第二个输入变量。

这是一个通过引用传递值的函数:

#include <iostream>
short getInput(short& input){
    std::cin >> input;
}
int main(){
    short input;
    getInput(input);
}

该示例代码段不仅更短,而且仅初始化一个short变量。我是否错了,因为它更有效。

杰里·科芬(Jerry Coffin)

一个小的,简单的内置类型的值,例如shortint几乎可以肯定会在寄存器中返回,因此它不需要创建任何内容。

如果我们将您的代码稍微简化为return 1;,我们会希望它的主体(当我们关闭优化功能时,根本就没有任何代码),最终我们将得到这样的结果:

mov rax, 1
ret

如果返回值是不是足够小,以适应在寄存器中,那么编译器通常会在调用者分配空间,并传递给函数被调用隐藏参考该空间。换句话说,它基本上会执行与手动操作相同的操作。

长话短说,您应该以最有意义的方式编写代码。如果if函数对返回值最有意义,则返回一个值。如果通过引用更有意义,请执行此操作。

在某些情况下,修改引用的变量而不是返回值确实是有意义的。一种是用于pop堆栈或队列中的a。如果复制返回值可能会抛出异常,那么异常安全性可能会有所不同。例如,您可以执行以下操作:

template <class T>
class queue {
    std::deque<T> data;
public:
    void pop(T &t) { 
        t = data.front();
        data.pop_front();
    }
};

如果尝试按值返回T,则最终可能会将该值从双端队列弹出,但是当您尝试复制返回值时,它的复制构造函数将抛出。

但是,通过这种方式,只有将复制成功复制到“返回”值中时,才从双端队列弹出该值。如果副本抛出,则该值保留在双端队列中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将非数组变量的地址传递给声明为“ Type ptr [static 1]”的函数参数是否有效?

来自分类Dev

什么是更有效的迭代列表并调用函数或将列表传递给函数

来自分类Dev

将复合文字传递给函数是否有效?

来自分类Dev

C:将变量传递给函数,此设计有效吗?

来自分类Dev

将$ scope变量传递给引用函数

来自分类Dev

比函数引用更有效的方法?

来自分类Dev

将全局变量传递给函数是否有问题?

来自分类Dev

将数组变量传递给函数以返回数组变量

来自分类Dev

将变量传递给对象键函数并返回给请求函数

来自分类Dev

从临时变量返回的引用是否有效?

来自分类Dev

将变量传递给函数

来自分类Dev

将变量传递给函数

来自分类Dev

将非算术类型作为参数传递给cmath函数是否有效?

来自分类Dev

PHP变量范围:通过引用将默认值的参数传递给匿名函数?

来自分类Dev

将全局变量的引用传递给函数

来自分类Dev

js将变量传递给返回未定义的函数

来自分类Dev

js将变量传递给返回未定义的函数

来自分类Dev

html / javascript:无法通过按钮将变量传递给函数?

来自分类Dev

通过按钮将变量传递给函数(HTML / Javascript)

来自分类Dev

通过 app->make() 将变量传递给构造函数

来自分类Dev

是否可以将参数/变量传递给Onblur函数?

来自分类Dev

使用显式变量是否更有效?

来自分类Dev

如何将(void **)传递给函数并有效地取消引用/用于任何类型?

来自分类Dev

为什么通过通用引用运算符 (&&) 将变量的引用传递给可变参数模板函数失败?

来自分类Dev

将频繁使用的字段分配给局部变量是否更有效?

来自分类Dev

通过引用将Vec传递给函数

来自分类Dev

通过引用将指针传递给函数

来自分类Dev

通过将变量传递给带有yield的递归函数来找到最小值

来自分类Dev

将按引用传递和按值传递混合到可变参数模板函数是否有效?

Related 相关文章

  1. 1

    将非数组变量的地址传递给声明为“ Type ptr [static 1]”的函数参数是否有效?

  2. 2

    什么是更有效的迭代列表并调用函数或将列表传递给函数

  3. 3

    将复合文字传递给函数是否有效?

  4. 4

    C:将变量传递给函数,此设计有效吗?

  5. 5

    将$ scope变量传递给引用函数

  6. 6

    比函数引用更有效的方法?

  7. 7

    将全局变量传递给函数是否有问题?

  8. 8

    将数组变量传递给函数以返回数组变量

  9. 9

    将变量传递给对象键函数并返回给请求函数

  10. 10

    从临时变量返回的引用是否有效?

  11. 11

    将变量传递给函数

  12. 12

    将变量传递给函数

  13. 13

    将非算术类型作为参数传递给cmath函数是否有效?

  14. 14

    PHP变量范围:通过引用将默认值的参数传递给匿名函数?

  15. 15

    将全局变量的引用传递给函数

  16. 16

    js将变量传递给返回未定义的函数

  17. 17

    js将变量传递给返回未定义的函数

  18. 18

    html / javascript:无法通过按钮将变量传递给函数?

  19. 19

    通过按钮将变量传递给函数(HTML / Javascript)

  20. 20

    通过 app->make() 将变量传递给构造函数

  21. 21

    是否可以将参数/变量传递给Onblur函数?

  22. 22

    使用显式变量是否更有效?

  23. 23

    如何将(void **)传递给函数并有效地取消引用/用于任何类型?

  24. 24

    为什么通过通用引用运算符 (&&) 将变量的引用传递给可变参数模板函数失败?

  25. 25

    将频繁使用的字段分配给局部变量是否更有效?

  26. 26

    通过引用将Vec传递给函数

  27. 27

    通过引用将指针传递给函数

  28. 28

    通过将变量传递给带有yield的递归函数来找到最小值

  29. 29

    将按引用传递和按值传递混合到可变参数模板函数是否有效?

热门标签

归档