问题标签 [move-constructor]

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

c++ - 如何为具有私有对象作为属性的类编写移动构造函数和赋值运算符?

我今天学习了移动构造函数。我阅读了这个答案,并尝试将其中的移动构造函数示例应用到我的代码中。

但是,与该示例不同,我的类UnicodeString不仅仅包含一个简单的 C 数组。它包含一个std::vector<>对象,其元素是我编写的另一个类的实例。

首先,在move构造函数中,如何窃取UStringR-Value传递的另一个对象的向量?

其次,在赋值运算符中,如何有效地交换UStringUnicodeString对象的引用和 R-Value 传递的引用?请注意,这UString是一个私有属性,因此不能直接从另一个对象访问

0 投票
6 回答
11459 浏览

c++ - 通过调用移动赋值运算符实现移动构造函数

MSDN 文章How to: Write a Move Constructor有以下建议。

如果为类同时提供移动构造函数和移动赋值运算符,则可以通过编写移动构造函数来调用移动赋值运算符来消除冗余代码。以下示例显示了调用移动赋值运算符的移动构造函数的修订版本:

通过双重初始化MemoryBlock's 的值,这段代码效率低下,还是编译器能够优化掉额外的初始化?我是否应该总是通过调用移动赋值运算符来编写移动构造函数?

0 投票
1 回答
127 浏览

c++ - 派生对象绑定到基类引用时的复制/移动/转换语义?

我想尽可能多地理解 C++。如果有基类B和派生类DD d;实例化派生对象。

  1. B & rb = d;,rb指派生对象d。这不会实例化基类的新对象。那么是rb指哪个内存部分呢?

  2. B newb = d;,这将调用将调用基类的复制构造函数。Objectd将首先与参数 type 绑定const B&,然后实例化一个新的基类对象。

  3. B newbb(static_cast<B>(d));,在这个声明中将完成什么?

以上三个陈述是我自己理解copy/move/conversion对象的方式。但他们真的让我很困惑。尽管我已经阅读了C++11 标准的相应部分,但我找不到有效且清晰的方法来解释代码。

我希望答案能用代码引用解释这三个语句。在对象复制/移动/转换期间发生了什么。


帮助!希望各位大神解答!!

0 投票
4 回答
4552 浏览

c++ - C++11 右值引用也调用复制构造函数

我一直在测试一些 C++11 的一些特性。我遇到了 r 值引用和移动构造函数。

我实现了我的第一个移动构造函数,这里是:

代码工作正常。无论如何在复制构造函数中放置一个 std::cout 我注意到它被调用了!而且很多次..(移动构造函数 500000 次,复制构造函数 524287 次)。

更让我吃惊的是,如果我从代码中注释掉复制构造函数,整个程序会变得快很多,而这一次移动构造函数被调用了 1024287 次。

有什么线索吗?

0 投票
2 回答
298 浏览

c++ - 为什么移动构造函数需要使用“右值引用”?

例如,以下移动构造函数在没有&&(右值引用)的情况下工作:

我真的不明白为什么它是必要的......

0 投票
3 回答
261 浏览

c++ - Strange behavior of copy-/move-constructors & how to return large objects?

I have been experimenting with C++11 again recently, after some absence, and after reading many articles on the internet I am now thoroughly confused about what is the most efficient way to return large objects from factory functions (basically, data analysis from a database).

I have become a fan of unique_ptr, but I read in several articles that because of the new move-constructors it is now perfectly possible to return a big vector say by value and because of these new semantics it should be as fast as copying one pointer.

To try this out, I wrote a small test program with outputs in the various constructors:

and tested with

Now, if I just compile this as-is, the compiler optimizes away ("elides") various constructor calls and I get the output:

OK, but you can see how much copying has been optimized away. To see what is the "specified" behaviour, I compiled this with the flag -fno-elide-constructors (I'm using Apple LLVM version 4.2 (clang-425.0.28)). But then I get the following output:

So, clearly, something fishy is going on with the value-returned object. Obviously, this is more than just a small problem, because I would have expected -fno-elide-constructors not to change semantics, only the amount of constructors involved.

Thus I ask:

  1. What is going on? Why does the value object "lose" its string parameter? And where?
  2. It looks like value returns have problems whereas the other ones work just fine. So why are people recommending nowadays that we return by value and "the system takes care of the rest"?
  3. What is a good way to return large objects?
  4. Am I making a mistake somewhere that I am not seeing?

Thanks!

0 投票
2 回答
579 浏览

c++ - 依赖隐式声明的移动构造函数是否安全?

这是我获得大部分信息的地方: http: //en.cppreference.com/w/cpp/language/move_constructor

显然,这些是隐式生成的移动构造函数起作用的条件:

  • 没有用户声明的复制构造函数
  • 没有用户声明的复制赋值运算符
  • 没有用户声明的移动赋值运算符
  • 没有用户声明的析构函数
  • 隐式声明的移动构造函数未定义为已删除
  • 如果存在用户声明的移动构造函数,仍然可以使用关键字强制生成隐式声明的移动构造函数default

我的问题是:

  1. 依赖隐式自动移动构造函数是否安全?
  2. 如何检查它是否真的有效,而不是默认的复制构造函数?
  3. 最后,也是最重要的,这是一个好主意吗?为什么?还是定义我自己的总是更好?

我更倾向于遵循三规则并手动创建析构函数、复制和移动构造函数以及复制和移动赋值运算符,但我只是对这个隐含的操作感到好奇。

0 投票
5 回答
269 浏览

c++ - C++:存储复制操作不合理或不可能的资源

我想编写一个ContentManager类来加载和维护游戏的不同类型的资产(与XNA 的 ContentManager相比)。我的头文件如下所示:

如您所见,我为每种资产类型(目前仅适用于纹理)和一个通用Load<T>()方法都有一个映射,我为我想要存储的每种资产类型显式地实例化了它。Load<Texture>()从磁盘读取图像文件(如果它不在地图中),创建一个新的Texture,将其插入地图并返回它。

我的Texture类基本上创建并封装了一个原始IDirect3DTexture9以遵循RAII成语(析构函数调用Release()texture_

在测试我的代码时,我意识到每个纹理都被释放了两次,因为对象的(浅)副本是Texture在某个时候创建​​的,当然,每个对象都调用了析构函数。

此外,虽然Load<T>()返回对地图元素的引用,但调用者可以自己制作副本并触发相同的问题。我的想法:

  • 将复制构造函数设为Texture私有不是解决方案,因为在创建std::pair将新元素插入地图时无论如何都需要副本。

  • 定义一个创建深层副本的自定义复制构造函数似乎根本不合理,因为我需要创建底层 Direct3D 纹理的副本,它应该只存在一次。

那么我在这里有什么选择呢?这可以通过使用智能指针来解决吗?哪种类型应该存储在地图中,哪种类型应该Load<T>()返回?

0 投票
1 回答
55 浏览

c++11 - 移动构造函数采用常量右值有什么意义?

根据http://en.cppreference.com/w/cpp/language/move_constructor“一个类可以有多个移动构造函数,例如两者T::T(const T&&)T::T(T&&)

什么时候想要将一个常量右值传递给移动构造函数?

0 投票
1 回答
5399 浏览

c++ - 移动 std::vector 成员的语义

我想确保我正确理解这一点。我在这里问它,因为我没有明确说明它的资金。

例如,我有一个基本上是这样构建的三角形网格类:

由于网格中的数据可能会变得非常大,我想实现正确的移动语义。对于指针类型,我完全理解这一点,但要触发右值构造函数,我需要使用移动,对吧?

例如,右值构造函数将是:

注意:在有人指出明显之前,该应用程序在许多地方都使用了 share_ptr。但我不想人为地限制类的使用。