草庐IT

深浅拷贝

全部标签

c++ - 将右值传递给非引用参数,为什么编译器不能删除拷贝?

structBig{inta[8];};voidfoo(Biga);BiggetStuff();voidtest1(){foo(getStuff());}编译(在Linux上使用clang6.0.0forx86_64,所以SystemVABI,标志:-O3-march=broadwell)到test1():#@test1()subrsp,72leardi,[rsp+40]callgetStuff()vmovupsymm0,ymmwordptr[rsp+40]vmovupsymmwordptr[rsp],ymm0vzerouppercallfoo(Big)addrsp,72ret如果我没

c++ - 混合共享/静态库时静态成员的多个拷贝

情况:我有:classPlatform{public:Platform(){count++;cout创建为静态库。考虑做一个动态库扩展class__declspec(dllimport/dllexport)DerivedPlatform:publicPlatform{}是的,我知道我是从非dll接口(interface)类派生的。每:Arestaticfieldsinherited?,应该只有一个计数实例。这是棘手的部分,实际上我最终得到了count的两个不同拷贝(即使count被声明为静态的)。即,在加载dll并调用registerPlatforms()后,它会增加一个不同的计数对象

c++ - 如果同一数据位于不同的数据结构中,则维护它们的两个拷贝是否是一种不好的做法?

假设我有一组通用的索引对象U,以及这些对象的子集S。S很大(例如,1,000,000个元素),但是U大得多(例如,至少100,000,000个元素)。我想对这些集合执行两个基本操作:(1)给定从0到U的大小减1的任何整数x,检查S的成员资格,如果不是成员,然后将x添加到S,和(2)从S中选择(并移除)一个随机元素。为了执行操作(1)的第一部分,我认为保留一个大小为U的boolvectorv是有意义的,其中值为true如果元素x是集合S的成员。但是,因为U比S大很多,所以在v中随机选择一个元素,希望它也是S中的一个元素S没有意义。如果U比S大100倍,那么它只会找到S的一个元素,平均每1

C++:制作对象的浅表拷贝a)语法b)我需要删除它吗

我有一个类MyClassA。在其构造函数中,我将指针传递给B类的实例。我有一些与此相关的非常基本的问题。(1)首先,下面的代码是否正确?(浅拷贝的代码和methodA()中的代码)MyClassA::MyClassA(B*b){this.b=b;}voidMyClassA::methodA(){inti;i=b.getFooValue();//ShouldIratherbeusingthearrowoperatorhere??//i=b->getFooValue()}(2)我猜我不需要担心在析构函数~MyClassA()中删除MyClassA.b的内存,因为它没有分配。我对吗?谢谢更新

c++ - 如何创建 QList 的深拷贝 (Qt 4.8)

我正在尝试制作QList的深层拷贝,我使用的是Qt4.8。在下面的代码中mData是QListTest的成员变量类。首先我认为下面的代码应该可以工作,但是深入研究Qt的隐式共享(即写时复制)概念,我怀疑这是否是正确的方法。Test::Test(QList&aData){mData.QList(aData);}根据Qt,QList::QList(constQList&other)Constructsacopyofother.Thisoperationtakesconstanttime,becauseQListisimplicitlyshared.ThismakesreturningaQL

c++ - 通过按值传递的 CRTP 模式的单元化拷贝

我正在使用CRTP模式,并尝试定义适用于其实现的运算符。我发现了未初始化对象的一种奇怪行为。CRTP基类:templatestructCRTP{usingself_t=C;constself_t&self()const{returnstatic_cast(*this);}self_t&self(){constCRTP&cs=static_cast(*this);returnconst_cast(cs.self());}voidprintValue(){cout实现1:structImpl:publicCRTP{Impl()=default;Impl(Impl&&)=default;Im

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景拷贝构造函数的使用在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数,其特征如下:拷贝构造函数是构造函数的一个重载形式。拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。classDate{public: Da

c++ - 将迭代器从原始容器镜像到它的拷贝

我有一个类,它是一个容器的委托(delegate),并在内部存储一个迭代器到这个容器。classA{public:listm_data;list::iteratorm_relevantDataStart;A(constA&cpy){m_data=cpy.m_data;m_relevantDataStart=cpy.m_relevantDataStart;//现在的问题是,如果我尝试编写一个简单的构造函数来如上所述复制容器和迭代器,迭代器在复制的上下文中变得不可用,更具体地说,我稍后在尝试执行时遇到运行时异常比较:`if(m_relevantDataStart==m_data.begin

c++ - 错误,无法在构造函数主体中构造 lambda 的拷贝

这个问题在这里已经有了答案:UnderstandinghowLambdaclosuretypehasdeleteddefaultconstructor(2个答案)关闭5年前。下面接受一种初始化成员的方式,另一种是错误的。我不明白:templatestructLambdaHolder{LambdaHolder(TlambdaIn){lambda=lambdaIn;}//ThiswillnotworkLambdaHolder(TlambdaIn):lambda(lambdaIn){}//ThiswillworkfineTlambda;};intmain(){autolambda=[](){

c++ - 指针深拷贝的 vector

我是一个非常新的程序员,也是一个super初学者,所以我对C++了解不多。我有一个关于制作指针的深层拷贝的问题。我拥有的是一个充满POD的A类和一个指向此类的指针(A*P)。我有第二个B类,其中包含一些其他POD和指向A类的指针vector。我想用A*P的深层拷贝填充这个vector,因为在一个循环中我将动态分配和释放它。以下不起作用。我相信它是我的复制构造函数和=运算符的重载。这是我为了乐趣和学习而做的事情。classA{public:...............};classB{public:B();~B();B(constB&Copier);B&B::operator=(con