问题标签 [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.
arrays - Fortran 2008:如何返回函数返回值?
在现代 Fortran 中是否可以从函数返回一个数组,其性能相当于让子例程填充作为参数传递的数组?
考虑例如作为简单的例子
在这里,该行C = FUNC()
将从函数返回值中复制值,然后从堆栈中丢弃返回的数组。子例程版本CALL SUB(C)
将直接填充C
,避免了与临时数组相关的额外应对步骤和内存使用——但在表达式中使用却是SUM(FUNC())
不可能的。
但是,如果编译器实现选择在堆上分配所有数组,则可以简单地通过更改底层指针来分配返回值C
,从而在两个版本之间实现相同的性能。*
这种优化是由常见的编译器进行的,还是有其他方法可以在没有性能开销的情况下获得函数语义?
* 使用可分配数组会更明显,但这会遇到编译器支持问题。默认情况下,英特尔 fortran 在分配不同大小的数组时不会(重新)分配数组,但通过使用ALLOCATE(C, SOURCE=FUNC())
语句允许相同的效果。Gfortran 同时在分配时进行自动分配,但有一个错误会阻止ALLOCATE
从参数派生形状的语句,SOURCE
并且该修复尚未包含在二进制版本中。
c++ - 按值返回 std::string 是否安全?
在下面的代码中,一个字符串被封装在一个类 Foo 中。
对 Foo::getText() 的调用按值返回字符串。这将创建字符串对象的第二个实例,但两个字符串对象现在都指向堆上的同一个字符缓冲区。
当 Foo 实例被删除时,封装后的字符串会被自动销毁,因此堆上的 char 缓冲区也会被删除。
即使getText()
按值返回字符串,生成的字符串对象仍然依赖于原始字符串对象的生命周期,以保留它们相互指向的 char 缓冲区。
这是否意味着打印retval
到终端是对已在堆上释放的内存的无效访问?
我想很多人认为,因为字符串是按值返回的,所以他们不需要关心 Foo 中原始字符串的生命周期。这个问题与字符串并不严格相关,但实际上适用于任何具有封装指针的类,这些指针在销毁时是释放的。但是,当涉及到字符串时,这里的最佳实践是什么?
- 从不按值返回字符串?
- 如果原始字符串的生命周期得到保证,则仅按值返回字符串?
- 总是复制字符串?
return std::string(retval.c_str());
- 执行与调用者的合同
getText()
?
编辑:
我想我被 RVO 误导了。此示例中的所有三个字符串都在同一地址返回一个 c_str。RVO 是罪魁祸首吗?
结果:
c++ - C++ 用纯虚函数实例化抽象类的子类
我有一个抽象类,例如Animal。Animal 有一个纯虚函数eat,如果每个动物不想挨饿,都必须实现它。我确保只有 Animal 的孩子可以通过这种方式实例化:
动物.hpp
动物.cpp
有了这个,猫将是:
猫.hpp
猫.cpp
但是这段代码不起作用,它在GetAnimal中得到一个错误invalid abstract return type 'Animal',因为 Animal 是抽象的并且不能被实例化,尽管我的 API 确保它不会。
这个问题可能有哪些智能解决方案?我可以做函数Eat not pure 并给它一个默认实现,但我不想这样做。
c++ - 我什么时候应该按值返回,而不是返回唯一指针
我想知道的是,在传递它们、内存管理和在实践中使用它们方面,按值返回 aCat
实际上与返回a 有何不同。std::unique_ptr<Cat>
明智的内存管理,它们不一样吗?作为由值返回的对象和包装在 unique_ptr 中的对象,一旦超出范围,它们的析构函数就会被触发?
那么,您将如何比较两段代码:
c++ - 我应该如何从函数中返回一个对象?
考虑以下场景:有一个类CDriver
负责枚举所有连接的输出设备(由COutput
该类表示)。其代码可能如下所示:
现在CDriver
应该能够授予用户对枚举COutput
s 的访问权限。
实现这一点的第一种方法是返回一个指针:
在我看来,这种方法存在的问题是,如果指针由用户存储并且在CDriver
对象被销毁后仍然存在,那么它现在是一个悬空指针。这是由于在对象COutput
的析构过程中指针(对象)已被销毁CDriver
。
第二种方法是通过引用返回:
这里的问题与使用指针的方法相同。此外,它还有一个额外的警告,即不能返回真正的无效对象。如果 anullptr
作为返回指针返回,很明显它是“无效的”。nullptr
但是,在引用方面没有等价物。
继续接近第三。按值返回。
在这里,用户不必担心返回对象的生命周期。但是,COutput
必须复制对象,并且与参考方法类似,没有直观的方法来检查错误。
我可以继续...
例如,COutput
可以在堆上分配对象并存储在std::shared_ptr
s 中并按原样返回。然而,这会使代码非常冗长。
有什么办法可以直观地解决这个问题,并且不会引入不必要的代码冗长?
c# - C# 按值复制对象
我有一个具有许多属性的对象,我需要在每次迭代中创建该对象的副本,以便所有属性都复制到具有最后设置值的新生对象中。(我不能一个一个地复制所有属性和它们的值,因为我的对象实际上是一个自定义的用户控件,它有很多属性,我不知道所有的属性!)
c++ - 对 r-value 的引用(r-value 的地址)
考虑我们有一个按值返回的函数:
如果我在上面的评论中所说的内容有误,请纠正我。
现在我们可以通过对它进行常量引用来延长临时对象的生命周期。
问题是:由于我创建了一个对应该被销毁的临时对象的常量引用,这是否意味着cout << &y << endl
将打印该临时对象的地址,因为引用只是“别名”?那些临时对象(R值)存储在内存中的哪里(我使用原始类型 int 但它可能是类)?
typescript - ionic 3 typescript:按值在页面之间传递对象
我正在开发 Ionic 3 应用程序,我有一个页面列出项目,如果我们单击一个项目,它会转到页面项目更新
页面项目更新包含一个更新按钮,但是当我更新了一些输入并且我没有点击更新按钮就返回时,我发现该项目已经更新
所以我认为问题在于我通过引用传递了该项目:
代码:
项目页面模板(这里的项目 = 食谱):recipes.html
商品详情页面组件:recipe.ts
问题我怎样才能通过价值而不是参考的配方?
c++ - c ++:函数返回期间“捕获值中的引用”与“捕获值中的值”有什么区别?
当我们通过返回引用分配时,内部 1 和 2 到底发生了什么?
下面会发生什么不同(分配的返回值)?: