Luk*_*son 2 c++ arrays return-value
我正在实现一些类来表示映射(在数学意义上),即f:R x R ^ n - > R ^ n.我想实现一个抽象基类:1)将std :: array作为引用并修改它或者2)返回一个std :: array(按值或通过引用,不确定?)
选项2的语法对我来说更为可取,因为我认为代码看起来更像我试图表示的数学,但我想确保我不是不必要地复制东西并引发一堆不希望的开销.例如,如果我有:
// Function f declaration
std::array<double, 4> f(double t, const std::array<double, 4> & x);
// Some code snippet that uses f
std::array<double, 4> x = {0.0, 1.0, 2.0, 3.0};
double t = 0.0;
std::array<double, 4> dxdt = f(t, x);
Run Code Online (Sandbox Code Playgroud)
如何确定是否在最后一行执行了副本,或者如何确保它不会发生?
在f()的定义中,我需要做什么(如果有的话)以确保在不调用复制构造函数的情况下返回它?我想保持使用简单,所以客户端不需要使用指针或智能指针,但也许这是必要的?
我知道我可以将其更改为返回void并且只使其中一个参数为std :: array dxdt,但我更喜欢返回值语法,只要没有性能损失或内存泄漏问题.
它应该是您不应该关心的事情,因为优化副本是一个编译器问题.但编译器仍然是基于图灵的机器,不能自己发明优化.
据我所知,今天的大多数编译器都有行为,如果是函数:
编译器将该变量分配给它必须由函数调用所属的表达式计算的位置.没有为此生成副本.
如果你的函数有多个出口返回不同的表达式,那么 - 某些特定情况 - 就无法完成.
所以,一般来说,如果你必须返回一些宽对象,只需声明它并确保所有return语句都返回它.