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

python - ctypes 包装器,用于由具有析构函数的 C++ 类的值对象返回的函数

可以ctypes用析构函数包装返回 C++ 类的对象(不是指针/引用)的函数吗?下面的示例在调用时会出现段错误lib.init_point_by_value

foo.cpp

foo.py

编译并运行它:

输出:

0 投票
2 回答
234 浏览

c++ - 按值返回与右值引用

在回答有关返回临时工的问题后,我注意到第二个回答略有不同。

它不是按值返回,而是按右值引用返回。您能解释一下这些方法之间的区别以及它们的风险在哪里吗?

0 投票
1 回答
105 浏览

c++ - 平凡与非平凡类型的复制省略差异

当一个函数的按值返回直接按值传递给另一个函数时,我正在检查普通和非普通可复制类型之间的复制省略。对于非平凡的情况,似乎对象是按预期直接传输的,但对于平凡的情况,似乎输出对象被复制到堆栈上以生成第二个函数的输入对象。我的问题是,为什么?

如果这是意料之中的,那就令人惊讶了,因为非平凡可复制类型在这些函数之间传递的效率更高。

资源:

GCC 输出汇编:

神螺栓.org。我尝试了 GCC、Clang 和 MSVC;GCC 的程序集对我来说更容易阅读,但所有编译器似乎都为简单可复制的情况编写了类似的代码。

杂项:

  • 显然,如果我将类定义中Nontrivial_Struct( Nontrivial_Struct const& ) = default复制构造函数声明为;如果我在类定义之后添加Nontrivial_Struct::Nontrivial_Struct( Nontrivial_Struct const& ) = default; 那么它仍然很重要。
  • 我可以将“4”更改为较大的值,例如“64”,它仍然会发生。

推测:

0 投票
2 回答
77 浏览

c++ - 将这个指针按值赋值给getter的返回值是什么意思?

当我跳入现有代码并错误地使用 getter 设置属性时,我产生了这个疑问,

而不是调用setter,

我没有意识到错误,因为编译或运行时没有错误;该任务导致无操作。

所以我想出了下面的例子,它输出337

所以我的问题是两个方面:

  • inb.getAbyVal() = A{7};有什么不同b.getXbyVal() = 3;使得前者编译而后者不编译(除了类型是Aand的事实之外int)?
  • 更改void operator=(A const& other) { x = other.x; }void operator=(A const& other) & { x = other.x; }使b.getAbyVal() = A{7};编译失败。为什么会这样?
0 投票
1 回答
42 浏览

c++ - 当我从函数返回自动变量时,为什么复制构造函数不起作用?

在下面的示例中,我想找出当我从 doit() 函数返回一个自动变量时,为什么不调用复制构造函数。我知道调用第一个版本的处理程序是因为我们有一个临时对象,但无法弄清楚为什么在创建该临时对象时不调用复制构造函数(将所有内容从 s 复制到临时对象)。

0 投票
0 回答
68 浏览

c++ - 为什么复制省略不能优化所有复制操作?

我读到了复制省略以及它如何通过提供更直接的代码编写可能性而不考虑变量的引用来加快程序。在一个小例子中,我试图找出这种技术的局限性。

https://godbolt.org/z/xo88jq

输出:

在这个例子中,编译器已经删除了许多副本。但是为什么编译器不能删除所有导致 a 或 b 修改的副本?

0 投票
2 回答
104 浏览

c++ - C++ 复制构造函数在 return-by-vlaue 中激活

我无法找到以下问题的具体答案:

考虑以下代码:

复制构造函数在没有编译器优化的情况下被激活了多少次?

如果没有移动构造函数,不是一次将o2复制到调用函数,另一次构造o1吗?

如果有move构造函数,不是一次将o2复制到调用函数,另一次构造o1(第二次是move const)吗?

0 投票
0 回答
38 浏览

c++ - 为什么函数或方法必须返回引用才能被链接?

我一直在复习 C++ 以准备上课,而让我感到困惑的是返回引用与返回值(也与返回 const 引用相比,但这并不是问题的一部分)。我在几个地方读到的内容是,您希望函数或方法返回引用,以便将其链接起来。例如,标准赋值运算符允许您执行以下操作:

而不是必须这样做:

我无法理解或找到一个简单的解释是为什么返回引用允许您进行链接而返回值则不允许?返回值时链接有什么问题?

0 投票
1 回答
45 浏览

c++ - 可变参数模板函数的 1-arg 重载有用吗?它应该使用魔法 && 参考吗?在这种情况下是否发生了复制省略?

我有一个现有std::ostream的 -like 类型,它对operator<<各种类型有几个重载。由于该类型用作const&其他 API 的参数,因此我在调用站点添加了方便的工厂函数以便于内联使用。

我编写了下面的代码,它工作正常(VS2019 和 GCC9),但我想知道几件事:

  1. 我真的需要 1-arg 重载吗?拥有它有什么好处吗?
  2. 1-arg 重载使用 (Scott Meyers') 魔术引用,但可变参数重载应该使用它们吗?我试过Ts...&&了,但 VS2019 不喜欢这样。
  3. 在 Debug 中,我遵循 return 语句,并看到 osl 被移动构造,当我期待 Copy-Elision 发生时,对于这样的助手,使其零开销。这是一个调试构建工件吗?或者以某种方式复制省略不能在这里发生?如果是这样,为什么?