簡體   English   中英

C ++ 11右值引用尋址

[英]C++11 rvalue reference addressing

我試圖了解c ++ 11 move語義,並創建了以下沙箱項目:

main.cpp

#include "my-class.h"
#include <iostream>

MyOtherClass getRValue(void)
{
  MyOtherClass retVal;
  std::cout << "Address of getRValue local var is " << &retVal << std::endl;
  std::cout << "Returning from getRValue...\n";
  return retVal;
}

int main()
{
  MyClass bar(getRValue());
  std::cout << "Address of bar member is " << &(bar.getObjRef()) << std::endl;
  return 0;
}

我的課

#ifndef MY_CLASS_H_INCLUDED
#define MY_CLASS_H_INCLUDED

#include <iostream>

class MyOtherClass
{
private:
  int somePOD;
  char someOtherPOD;

public:
  MyOtherClass(void);
  MyOtherClass(MyOtherClass const& argOther);
  MyOtherClass(MyOtherClass&& argOther);
};

class MyClass
{
private:
  MyOtherClass obj;

public:
  MyClass(MyOtherClass&& arg);
  MyOtherClass& getObjRef(void);
};

#endif // MY_CLASS_H_INCLUDED

my-class.cpp

#include "my-class.h"

// Class MyOtherClass
MyOtherClass::MyOtherClass(void)
: somePOD(42), someOtherPOD('x')
{
  std::cout << "MyOtherClass c'tor called.\n";
}
MyOtherClass::MyOtherClass(MyOtherClass const& argOther)
{
  std::cout << "MyOtherClass copy c'tor called.\n";
}
MyOtherClass::MyOtherClass(MyOtherClass&& argOther)
{
  std::cout << "MyOtherClass move c'tor called.\n";
}

// Class MyClass
MyClass::MyClass(MyOtherClass&& arg)
: obj(std::move(arg)) 
{
  std::cout << "MyClass c'tor called.\n";
}
MyOtherClass& MyClass::getObjRef(void)
{
  return this->obj;
}

此代碼顯示輸出:

MyOtherClass c'tor called.
Address of getRValue local var is 0x7fff882a2db8
Returning from getRValue...
MyOtherClass move c'tor called.
MyClass c'tor called.
Address of bar member is 0x7fff882a2db0

我的問題是:為什么是本地var的地址。 和酒吧成員不同? 這兩個移動語義不是全部相同嗎? 還是我在示例中只是做錯了什么?

每個對象都有其自己的地址。 由於barretVal是不同的對象,因此它們具有不同的地址。 移動不會更改對象的地址。

移動的作用是允許您將物體的內臟從一個物體移動到另一個物體。 根據類的制作方式,這可以極大地提高性能。 例如,如果我們有一個像std::vector這樣的類,它將在其中有一個指向它分配的存儲的指針。 移動允許您僅將指針和大小從對象移動到對象之間復制。 然后,您只需將指針從對象移動到空指針,並將大小設置為0。現在,我們不必復制任何元素或分配任何存儲,而如果要進行復制,則無需這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM