问题标签 [return-by-value]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
317 浏览

c - C - 矩阵作为值传递?

我正在为 C 项目设计矩阵处理函数。我正在考虑按值或按引用传递矩阵。我创建了一个按值和按引用传递矩阵的基准测试,两者在 gcc 中使用优化标志 -O0 和 -O2 的性能似乎相同。鉴于我的基准测试可能给出不正确的结果,我想知道仅使用 C 将矩阵传入和传出函数调用的最有效方法是什么。

结果:

0 投票
4 回答
12980 浏览

c++ - 为什么我们从方法中按值返回对象时会调用复制构造函数

为什么当我们从方法中按值返回对象时会调用复制构造函数。请看我下面的代码,因为我从一个方法返回一个对象,而返回控制是点击复制构造函数然后返回。我不明白以下事情:
1)为什么它调用复制构造函数。
2)哪个对象隐式传递给复制构造函数,
3)复制构造函数将内容复制到哪个对象,
4)在返回时复制对象内容的必要性是什么。所以请帮忙。

0 投票
2 回答
285 浏览

c++ - 通过引用或值返回的 C++ 函数的内存占用?

我正在尝试减少主要用 C++ 开发的应用程序的内存占用,而我正在研究的一件事是通过引用返回一个特别大的数据结构,而不是按值返回它们。我需要一些确认。例如,假设我在一个类some_object中有如下成员函数:

对比

我的理解是否正确,通过调用后者(按值返回)进行分配会some_type在应用程序执行期间的某些点在内存中留下两个数据副本,而调用前者(按引用返回)可以避免这种情况?

作为减少内存占用的总体目标的一部分,另一项努力是以some_type排除使用上述按引用返回选项的方式更改定义的方式。在这种情况下,因为some_type(它实际上是一个容器,比如说,类型数据的容器data_type)在循环中使用,如下所示:

我假设如果我们被限制使用上面的按值返回,那么我需要通过引入一个新函数来按值获取容器的元素来进行如下更改get_some_type_at(这样做有什么缺点我应该是知道,比如说,在性能方面?):

同样,我主要是在寻找对这些方面的确认。但细节和见解是最受赞赏的。感谢您的时间和兴趣!

0 投票
0 回答
449 浏览

c++ - C ++:按值返回,与持久对象的按引用返回?

编译器优化后的程序速度哪个更好:按值返回,还是按引用返回持久对象?

T将是原语、指针、成员指针或用户定义的小型 PO、D. 类数据。

据我所知,它是按值传递,但也有可能是按引用传递的情况:

  • 传值:

    • 返回一个T是一个较小的对象,并且可以快速复制到调用者的变量中。
    • 优化器可以使用 (N)RVO 和复制省略来删除返回的副本。
    • 优化器可以将生成代码或生成的值内联到调用者的代码中。
    • 程序不需要访问 RAM,无论是否缓存。
  • 参考传递:

    • 优化器可能会完全评估持久值,并将其使用替换为文字等价物。这是否发生会影响分析的其余部分。
    • 如果持久值被完全评估并替换为文字:
      • 没有价值返回。
      • 优化器可以轻松地内联文字。
      • 程序不需要访问 RAM,无论是否缓存。
    • 如果无法完全评估和替换持久值:
      • 返回一个引用是一个小对象,并且可以快速复制到调用者的变量。
      • 优化器可以使用 (N)RVO 和复制省略来避免返回副本。
      • 优化器不能将生成代码或生成的值内联到调用者的代码中。
      • 程序需要访问 RAM,尽管这可能在 L1/L2/等中。缓存。

背景:

我被迫考虑这一点,因为在某些平台上,如果我按值返回会触发一些浮点异常,但如果我按参数引用填充则不会。(这是给定的;这个问题不是要争论这一点。)所以,我想要的 API 和我被迫考虑使用的 API 是:

因为,我讨厌“填充”API,(因为它将定义与初始化分开,防止创建临时对象等)我可以将其转换为按引用返回的版本,例如:

0 投票
1 回答
220 浏览

c++11 - 按值 C++11 在返回时复制 ctor

当存在移动构造函数时,c++11中的按值返回是否需要复制ctor?GCC 4.7.1 抱怨 copy-ctor 被隐式​​删除,因为我只有一个移动构造函数,但我认为在这种情况下它应该使用移动构造函数。

在我真正需要之前,我不想添加复制构造函数。

编辑:

抱歉,我发现我忘记了移动构造函数......我只有移动分配:-(

0 投票
3 回答
210 浏览

c++11 - 在 C++11 中返回局部值的最佳方法

在过去,如果我想要一个对象的字符串表示A,我会写一些带有签名的东西void to_string(const A& a, string& out)以避免额外的副本。这仍然是 C++11 中的最佳实践,具有移动语义和所有功能吗?

我已经阅读了一些关于其他上下文的评论,这些评论建议依赖 RVO 而不是编写string to_string(const A& a). 但 RVO 不保证会发生!那么,作为 to_string 的程序员,我如何保证不会不必要地复制字符串(独立于编译器)?

0 投票
2 回答
501 浏览

c++ - 为什么不调用复制构造函数

这是一个简单的类头文件和一个主程序。在主程序中,我认为复制构造函数在三种情况下被调用:初始化(显式复制),函数参数传值,函数传值。但是,似乎没有要求其中之一,我认为(3)或(4)在评论中编号。调用哪个数字 (1) - (4)?谢谢。

Xh:

主要的:

输出:

0 投票
5 回答
16912 浏览

c++ - 为什么我们在赋值运算符重载中使用引用返回而不是在加减运算中?

正如我在书籍和网络中所读到的,在 C++ 中,我们可以使用这些原型重载“加号”或“减号”运算符(作为 a 的成员函数class Money):

const Money operator +(const Money& m2) const;

const Money operator -(const Money& m2) const;

对于赋值运算符:

const Money& operator =(const Money& m2);

为什么在赋值运算符重载中而不是在加号和减号运算符中使用对 Money 对象的引用作为返回值?

0 投票
3 回答
3690 浏览

c++ - 具有大型数据结构的值语义与输出参数

2013 主题演讲:Chandler Carruth:优化 C++ 的紧急结构

  • 42:45
    你不需要输出参数,我们在 C++ 中有值语义。...任何时候你看到有人争辩说 nonono 我不会按价值返回,因为复制成本太高,有人在优化器上说他们错了。好的?我还从未见过该论点正确的一段代码。...人们没有意识到值语义对优化器的重要性,因为它完全阐明了别名场景。

谁能把这个放在这个答案的上下文中:https ://stackoverflow.com/a/14229152

我听说不断重复,但是,对我来说,返回某些东西的函数是source。通过引用的输出参数从函数中取出该特征,并且从函数中删除这种硬编码特征允许人们在外部管理,而不是管理输出将如何存储/重用。

我的问题是,即使在那个 SO 答案的上下文中,有没有办法告诉,以其他等效方式重组代码,“现在看,这种方式的值语义不会丢失输出参数版本”,或者钱德勒的评论是针对某些人为情况的?我什至看到 Andrei Alexandrescu 在一次谈话中争论这一点,并告诉你不能逃避使用 by ref 输出以获得更好的性能。

有关 Andrei 评论的另一种看法,请参阅Eric Niebler:Out Parameters、Move Semantics 和 Stateful Algorithms

0 投票
5 回答
99685 浏览

c++ - C++ 返回值、引用、常量引用

你能解释一下返回值、引用值和 const 引用值之间的区别吗?

价值:

非常量参考:

常量参考:

这有什么好处?我理解将 const 引用传递给函数背后的意义,因为您要确保不修改该引用指向函数内部的值。但是我对返回 const 引用的含义感到困惑。为什么返回引用优于返回值,为什么返回 const 引用优于返回非 const 引用?