问题标签 [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 投票
2 回答
2047 浏览

arrays - Fortran 2008:如何返回函数返回值?

在现代 Fortran 中是否可以从函数返回一个数组,其性能相当于让子例程填充作为参数传递的数组?

考虑例如作为简单的例子

在这里,该行C = FUNC()将从函数返回值中复制值,然后从堆栈中丢弃返回的数组。子例程版本CALL SUB(C)将直接填充C,避免了与临时数组相关的额外应对步骤和内存使用——但在表达式中使用却是SUM(FUNC())不可能的。

但是,如果编译器实现选择在堆上分配所有数组,则可以简单地通过更改底层指针来分配返回值C,从而在两个版本之间实现相同的性能。*

这种优化是由常见的编译器进行的,还是有其他方法可以在没有性能开销的情况下获得函数语义?


* 使用可分配数组会更明显,但这会遇到编译器支持问题。默认情况下,英特尔 fortran 在分配不同大小的数组时不会(重新)分配数组,但通过使用ALLOCATE(C, SOURCE=FUNC())语句允许相同的效果。Gfortran 同时在分配时进行自动分配,但有一个错误会阻止ALLOCATE从参数派生形状的语句,SOURCE并且该修复尚未包含在二进制版本中。

0 投票
2 回答
2919 浏览

c++ - 按值返回 std::string 是否安全?

在下面的代码中,一个字符串被封装在一个类 Foo 中。

对 Foo::getText() 的调用按值返回字符串。这将创建字符串对象的第二个实例,但两个字符串对象现在都指向堆上的同一个字符缓冲区。

当 Foo 实例被删除时,封装后的字符串会被自动销毁,因此堆上的 char 缓冲区也会被删除。

即使getText()按值返回字符串,生成的字符串对象仍然依赖于原始字符串对象的生命周期,以保留它们相互指向的 char 缓冲区。

这是否意味着打印retval到终端是对已在堆上释放的内存的无效访问?

我想很多人认为,因为字符串是按值返回的,所以他们不需要关心 Foo 中原始字符串的生命周期。这个问题与字符串并不严格相关,但实际上适用于任何具有封装指针的类,这些指针在销毁时是释放的。但是,当涉及到字符串时,这里的最佳实践是什么?

  1. 从不按值返回字符串?
  2. 如果原始字符串的生命周期得到保证,则仅按值返回字符串?
  3. 总是复制字符串? return std::string(retval.c_str());
  4. 执行与调用者的合同getText()

编辑:

我想我被 RVO 误导了。此示例中的所有三个字符串都在同一地址返回一个 c_str。RVO 是罪魁祸首吗?

结果:

0 投票
1 回答
33 浏览

c++ - 如何正确处理带有指针的对象的按值返回?

假设我有一个类Foo“有一个”单个成员变量,它是指向其他对象的指针Bla

如何处理此类对象的按值返回?

这将创建一个新的Fooand Bar,返回所创建对象的副本Foo,包括内部指针的副本,然后破坏本地对象及其Bla对象。因此,以下代码失败:

现在这通常被认为是糟糕的设计吗?

我应该提供一个复制构造函数吗?在这种情况下,深度复制更复杂的对象树可能会对性能产生严重影响。

我应该提供一个移动构造函数吗?那会正确处理bla指针吗?

0 投票
3 回答
1504 浏览

c++ - C++ 用纯虚函数实例化抽象类的子类

我有一个抽象类,例如Animal。Animal 有一个纯虚函数eat,如果每个动物不想挨饿,都必须实现它。我确保只有 Animal 的孩子可以通过这种方式实例化:

动物.hpp

动物.cpp

有了这个,将是:

猫.hpp

猫.cpp

但是这段代码不起作用,它在GetAnimal中得到一个错误invalid abstract return type 'Animal',因为 Animal 是抽象的并且不能被实例化,尽管我的 API 确保它不会。

这个问题可能有哪些智能解决方案?我可以做函数Eat not pure 并给它一个默认实现,但我不想这样做。

0 投票
3 回答
1267 浏览

c++ - 我什么时候应该按值返回,而不是返回唯一指针

我想知道的是,在传递它们、内存管理和在实践中使用它们方面,按值返回 aCat实际上与返回a 有何不同。std::unique_ptr<Cat>

明智的内存管理,它们不一样吗?作为由值返回的对象和包装在 unique_ptr 中的对象,一旦超出范围,它们的析构函数就会被触发?

那么,您将如何比较两段代码:

0 投票
3 回答
96 浏览

c++ - 我应该如何从函数中返回一个对象?

考虑以下场景:有一个类CDriver负责枚举所有连接的输出设备(由COutput该类表示)。其代码可能如下所示:

现在CDriver应该能够授予用户对枚举COutputs 的访问权限。

实现这一点的第一种方法是返回一个指针:

在我看来,这种方法存在的问题是,如果指针由用户存储并且在CDriver对象被销毁后仍然存在,那么它现在是一个悬空指针。这是由于在对象COutput的析构过程中指针(对象)已被销毁CDriver

第二种方法是通过引用返回:

这里的问题与使用指针的方法相同。此外,它还有一个额外的警告,即不能返回真正的无效对象。如果 anullptr作为返回指针返回,很明显它是“无效的”。nullptr但是,在引用方面没有等价物。

继续接近第三。按值返回。

在这里,用户不必担心返回对象的生命周期。但是,COutput必须复制对象,并且与参考方法类似,没有直观的方法来检查错误。

我可以继续...

例如,COutput可以在堆上分配对象并存储在std::shared_ptrs 中并按原样返回。然而,这会使代码非常冗长。

有什么办法可以直观地解决这个问题,并且不会引入不必要的代码冗长?

0 投票
1 回答
4036 浏览

c# - C# 按值复制对象

我有一个具有许多属性的对象,我需要在每次迭代中创建该对象的副本,以便所有属性都复制到具有最后设置值的新生对象中。(我不能一个一个地复制所有属性和它们的值,因为我的对象实际上是一个自定义的用户控件,它有很多属性,我不知道所有的属性!)

0 投票
1 回答
134 浏览

c++ - 对 r-value 的引用(r-value 的地址)

考虑我们有一个按值返回的函数:

如果我在上面的评论中所说的内容有误,请纠正我。

现在我们可以通过对它进行常量引用来延长临时对象的生命周期。

问题是:由于我创建了一个对应该被销毁的临时对象的常量引用,这是否意味着cout << &y << endl将打印该临时对象的地址,因为引用只是“别名”?那些临时对象(R值)存储在内存中的哪里(我使用原始类型 int 但它可能是类)?

0 投票
1 回答
1308 浏览

typescript - ionic 3 typescript:按值在页面之间传递对象

我正在开发 Ionic 3 应用程序,我有一个页面列出项目,如果我们单击一个项目,它会转到页面项目更新

页面项目更新包含一个更新按钮,但是当我更新了一些输入并且我没有点击更新按钮就返回时,我发现该项目已经更新

所以我认为问题在于我通过引用传递了该项目:

代码:

项目页面模板(这里的项目 = 食谱):recipes.html

商品详情页面组件:recipe.ts

问题我怎样才能通过价值而不是参考的配方?

0 投票
1 回答
55 浏览

c++ - c ++:函数返回期间“捕获值中的引用”与“捕获值中的值”有什么区别?

当我们通过返回引用分配时,内部 1 和 2 到底发生了什么?

下面会发生什么不同(分配的返回值)?: