gpt4 book ai didi

C++ move 语义和内置类型

转载 作者:太空狗 更新时间:2023-10-29 22:56:52 25 4
gpt4 key购买 nike

我正在尝试使用以下代码来理解 move 语义。

#include <iostream>
#include <utility>
using namespace std;

class A
{
public:
int a;
A():a{1}{}
A(A&& rref):a{rref.a}{cout<<"move constructor called"<<endl;}
A(const A& ref):a{ref.a}{cout<<"copy constructor"<<endl;}
};

int main(){

A original; // original object

cout<<"original.a = "<<original.a<< "| address original.a="<< &(original.a)<<endl;

A movedto (std::move(original)); // calls A(A&&)

cout<<"original.a = "<<original.a<< "| address original.a"<< &(original.a)<<endl;
cout<<"movedto.a = "<<movedto.a<<"| address movedto.a"<< &(movedto.a)<<endl;

return 0;
}

给出以下输出

original.a = 1|  address original.a=0x7fff1611b6d0
move constructor called
original.a = 1| address original.a0x7fff1611b6d0
movedto.a = 1| address movedto.a0x7fff1611b6e0

可以看出,original.amovedto.a的地址不同,所以对成员a进行了复制A(A&& rref):a{rref.a} 中的操作。

我知道对于内置类型,move 降级为 copy。我的问题是如果我想劫持(而不是复制)类的一个实例,例如这个实例,我该怎么办。假设我有 100 个(而不是一个)内置类型的成员,使复制变得昂贵。

一个明显的方法是将对象存储在堆上并使用引用语义来传递它。但希望保留值(value)语义并且仍然能够规避复制。

最佳答案

这是不可能的和/或没有意义的。


我们从:

A original; // original object

问题的主要部分是:

What do I do if I want to hijack (not copy) an instance of the class such as this one?

所以这意味着我们最终得到:

A movedto; // new object that has all of original's members

但这里需要注意的是,我们想要“规避复制”并且我们不想使用引用或指针,即“引用语义”,只有“堆栈”或“值语义”。

如果我们希望 movedto 在已经分配的相同内存位置拥有相同的成员,那么我们可以创建对 original 的引用:

A& movedto{original}; // references members at the same memory locations. 

但是这个问题的一部分说明我们没有使用引用,因为大概我们希望这个对象有不同的生命周期。因此,如果我们想让 original 的成员“存活”并分配到当前 block 的末尾之后,那么我们会立即发现我们无法控制底层内存。


在这个问题中,original 是一个具有自动存储期限的对象。具有自动存储持续时间的对象会根据其范围自动管理其生命周期。编译器可能使用堆栈来存储它,并且编译器可能使用每次添加对象时向下 move 的堆栈指针,但 C++ 标准没有指定应该如何完成。我们确实知道该标准指定具有自动存储持续时间的对象将按照范围结束时创建的相反顺序销毁。

因此,试图控制创建具有自动存储持续时间的对象的位置没有意义,将此类对象的成员分配给另一个对象也没有意义。内存是自动分配的。

如果我们想重用已经分配为具有自动存储持续时间(堆栈/值语义)的对象的一部分的变量,那么我们使用的内存将在该对象的生命周期结束时被释放。我们必须为此使用动态存储(即“堆”或“引用语义”)。

关于C++ move 语义和内置类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com