C ++ 11 -значительная адресация ссылок

Я пытаюсь понять семантику перемещения c ++ 11 и создал следующий проект песочницы:

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;
}

мой-class.h

#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

мой-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

Мой вопрос: почему адреса местных вар. а член бара отличается? Разве не в этом смысл семантики перемещения, что эти двое будут одинаковыми? Или я просто делаю что-то не так в своем примере?

0

Решение

Каждый объект имеет свой собственный адрес. поскольку bar а также retVal это разные объекты у них разные адреса. Перемещение не меняет адрес объекта.

Что делает перемещение, так это то, что оно позволяет вам перемещать кишки объекта от одного объекта к другому. В зависимости от того, как сделан класс, это может быть очень большим приростом производительности. Например, если у нас есть класс как std::vector в нем будет указатель на хранилище, которое он выделил. Перемещение позволяет вам просто скопировать указатель и размер от перемещенного объекта к перемещенному объекту. Затем вы просто устанавливаете указатель в перемещенном объекте на нулевой указатель и устанавливаете размер равным 0. Теперь нам не нужно было копировать какие-либо элементы или выделять какое-либо хранилище, что мы должны были бы сделать, если бы вместо этого делали копию ,

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector