问题标签 [copy-elision]

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 回答
100 浏览

c++ - 使用已删除的移动/复制 ctor 返回类型的临时对象

考虑以下程序:

示例会话:

gcc 接受让我感到惊讶nakedBrace()。我认为从概念上讲这两个函数是等效的:S构造并返回一个临时函数。可能会或可能不会执行复制省略,但按照标准 (12.8/32) 的要求,移动或复制 ctor(两者都在此处删除)仍然必须是可访问的。

这是否意味着nakedBrace()永远不会构造 S?或者确实如此,但直接在带有大括号初始化的返回值中,因此在概念上不需要复制移动/ctor?

0 投票
0 回答
159 浏览

c++ - 具有不可复制类型的链式复制省略

考虑以下示例:

我有两个不可复制对象的链式复制可删除返回。gcc 5.2 编译得很好。但是 gcc 4.8 和 clang 3.7 都不喜欢它,因为实际上是在尝试执行复制。哪个编译器是对的?我假设 gcc 故意更改以允许这种行为,这对于这种情况似乎特别有用。

0 投票
2 回答
3505 浏览

c++ - 移动构造函数与复制省略。哪个会被调用?

我这里有两段代码给你看。它们是两个类,每个类都提供一个移动构造函数和一个返回临时值的函数。

  • 在第一种情况下,返回临时的函数调用移动构造函数
  • 在第二种情况下,返回临时值的函数只是告诉编译器执行复制省略

我很困惑:在这两种情况下,我都定义了一个移动构造函数和一个返回临时值的随机成员函数。但是行为发生了变化,我的问题是为什么

请注意,在以下示例中,运算符<< 被重载以打印列表(在第一种情况下)和双数据成员(在第二种情况下)。


移动构造函数被调用

输出是:

[列表] 移动构造函数调用

0

1


执行复制省略

输出是:

6.28


在第二个示例中,我期待调用移动构造函数。毕竟函数的逻辑是一样的:返回一个临时的。

有人会解释我为什么没有发生吗?

如何处理复制省略?

我希望我的代码是最便携的,我如何确定编译器的这些优化?

0 投票
4 回答
890 浏览

c++ - Clang 和 GCC 与 MSVC 和 ICC:如果复制/移动省略也可以应用,是否需要复制/移动构造函数中的 static_assert 才能工作?

我有一个我static_assert的模板结构的移动构造函数。static_assert即使复制省略是可能的,编译器是否需要考虑这一点?

这是精简的场景:

GCC 和 Clang 同意评估static_assert和编译失败。
另一方面,MSCV 和 ICC 可以很好地编译代码。

有趣的是,当我删除move构造函数的定义并像这样声明它时:

GCC 和 Clang 现在也编译代码。因此,所有编译器似乎都同意移动构造函数的定义与复制省略无关。

问题
如果static_assert复制/移动构造函数中有 a ,标准是否要求评估它,即使复制/移动省略是可能的?

0 投票
1 回答
99 浏览

c++ - 是否允许 C++ 编译器仅用构造替换构造 + 移动构造?

是否允许 C++ 编译器替换:

和:

即,发出分配,或者有什么可以防止这种情况发生?

注意:我问的原因是我更喜欢第一个版本。

0 投票
2 回答
133 浏览

c++ - understanding copy constructor calls and named return value optimization

I have been looking into this article about NRVO.

The output is the following on visual studio and this is how i understand it

If instead i write the main as

The output is the following and how understand it

Why is temporary not destroyed in Mymethod in the second version?

Why is copy constructor not called in RVO rvo = MyMethod(5);.I think copy constructor should be called twice in second version, one for the temporary created inside Mymethod and the other for RVO rvo = MyMethod(5); I know some call may be getting elided.Can someone please help in explaining these calls.

EDIT: Using return rvo instead of return (rvo) changes the output as

First case

second case

I guess when i removed the parenthesis, then NRVO kicks in.But i am more interested in the first output when there is no optimization

0 投票
1 回答
805 浏览

c++ - “保证复制省略”(P0135,C++1z)是否可能需要 ABI 损坏?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html

2016 年 6 月在芬兰奥卢举行的会议上,上述关于“保证复制省略”的提案被投票纳入 C++ 工作文件,然后被投票作为委员会草案发布。希望这会导致明年作为 C++17 标准发布。

该提案阐明了涉及临时对象的各种值类别,以强制在某些用例中不存在复制构造函数调用。

我的问题是“这个新要求是否可能会破坏以前在这些情况下可能没有进行复制省略的编译器的 ABI 兼容性,或者以与新要求不兼容的方式实现它?”

我正在考虑诸如初始化之类的事情,当可以内联对象的创建时会省略副本,但在跨越编译单元边界时则不会。

0 投票
2 回答
15823 浏览

c++ - 保证复制省略如何工作?

在 2016 年 Oulu ISO C++ 标准会议上,一项名为Guaranteed copy elision through简化值类别的提案被标准委员会投票通过了 C++17。

保证复制省略究竟是如何工作的?它是否涵盖了一些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

0 投票
1 回答
49 浏览

c++ - [Prob]为什么没有调用复制构造函数

我创建了一个类并通过构造函数初始化了一个对象数组,为什么或为什么不在这里调用复制构造函数?是复制省略吗?

0 投票
1 回答
186 浏览

c++ - 存储指向使用 NRVO 返回的对象的指针

如果我编写了一个在本地实例化对象然后按值返回的工厂方法,打算利用 NRVO(根据这里的一些答案:c++11 Return value optimization or move?),指针/引用会指向本地对象指向分配了方法返回值的对象?

正在使用:

builder.ObjectPtr 是否引用 newObject?