草庐IT

c++ - 为简单结构定义哪个复制/move 构造函数/运算符?

我的程序使用一个简单的结构Rect定义为structRect{intx1,y1,x2,y2;Rect():x1(0),y1(0),x2(0),y2(0){}Rect(intx1,inty1,intx2,inty2):x1(x1),y1(y1),x2(x2),y2(y2){}};我应该定义复制/move构造函数或赋值运算符,还是可以依靠编译器自动生成它们?问题与速度和使用原因有关(例如,move构造函数会影响程序执行速度)。构造函数和运算符是非常重复的工作,如果能依靠编译器自动生成就好了。Rect(constRect&r):x1(r.x1),y1(r.y1),x2(r.x2),y2(r.

c++ - 使用 std::move 和 std::shared_ptr 有什么好处和风险(如果有的话)

我正在学习C++11的特性,作为其中的一部分,我首先进入了unique_ptr和shared_ptr的世界。开始时,我编写了一些专门使用unique_ptr的代码,因此当我传递我的变量时,我需要使用std::move来完成它(或者让我明白)。经过一番努力,我意识到我确实需要shared_ptr而不是我正在做的事情。稍后快速查找/替换,我的指针被切换到共享,但我懒洋洋地只是留下了move()调用。令我惊讶的是,它不仅可以编译,而且在我的程序中表现得非常好,我得到了我期望的每一点功能......特别是,我能够“move”一个shared_ptr从ObjectA到ObjectB,并且两个对象

c++ - 涉及 const unique_ptr 的 move 构造函数

在下面的代码中,我将p设置为const,因为它在Foo的生命周期内永远不会指向任何其他int。这不会编译,因为调用了unique_ptr的复制构造函数,这显然已被删除。除了使p非常量之外还有什么解决方案吗?谢谢。#includeusingnamespacestd;classFoo{public://xisalargestructinrealityFoo(constint*constx):p(x){};Foo(Foo&&foo):p(std::move(foo.p)){};private:constunique_ptrp;}; 最佳答案

c++ - 如何强制调用 move 构造函数(C++)?

我有这对代码行:#includeusingnamespacestd;classA{public:A()noexcept{cout他们产生这个输出:A::A()A::A(constA&)A::A()A::A(constA&)我需要做什么才能从B::B(A&&)调用A::A(A&&)?如您所见,添加noexcept并不能解决这个问题。 最佳答案 尽管a的类型是对A的右值引用,但a本身是一个左值。要保留其右值性,您需要使用std::move:B(A&&a)noexcept:_a(std::move(a)){}

c++ - 使用 move-constructor 时将 self 重置为 nullptr 是个好习惯吗?

在C++11中,移动构造函数/运算符支持资源/内存移动。这是我的例子:classA{public:A():table_(nullptr),alloc_(0){}~A(){if(table_)delete[]table_;}A(constA&other){//table_isnotinitialized//if(table_)//delete[]table_;table_=newint[other.alloc_];memcpy(table_,other.table_,other.alloc_*sizeof(int));alloc_=other.alloc_;}A&operator=(co

c++ - move 变量在 std::move 之后是否有效?

我很难理解如果我从一个变量std::movePOD到另一个变量,源变量是否仍然有效,或者它是否像悬挂指针一样起作用?它仍然指向堆栈内存吗?例如:inta=5;intb=std::move(a)//bownsaresourcesnowa=10//isthisvalid?doesithavememoryaddress?std::cout 最佳答案 请注意,std::move不会move其参数,它只是将其转换为右值引用。实际move对象的是接受右值引用的构造函数或赋值运算符。但是int是内置类型,没有这样的构造函数或operator=,所

c++ - 在将大小较大的 vector move 到容量较小的 vector 之前,是否可以通过使用 reserve() 来提高代码性能?

如果这个问题不完整、不清楚或重复(这是我的第一个问题),请提前道歉。在研究move语义和为我的OOP类(class)做一个小项目时,我偶然发现了一个我自己无法回答的问题。据我所知std::move()通过将l值转换为r值来工作,但假设我们将一个包含很多元素的vectormove到容量为1的第二个vector中。我可以使用reserve()避免由于std::move()将r值move到第二个vector中,第二个vector的大量自动内存重新分配或者使用reserve()没有效果?可以在下面找到我的问题的简单实现。#include#include#includeintmain(){std

c++ - std::move() 作为性能瓶颈?

我有一个自定义环形缓冲区实现,它使用通过new[]分配的普通数组,然后使用std::move将元素move到数组中。这是我的push()方法的实现:voidpush(value_type&&value){_content[_end]=std::move(value);//9.2%ofexecutionisspendhereincrement();//0.6%here}我move到数组中的对象基本上只是一个指针和一个std::unique_ptr:structTask{Task(){}Functionfunction;Batch*batch;};函数看起来像这样:classFunctio

c++ - 如果 T 不可 move ,则 std::vector<T> 是否可 move ?

我在尝试movestd::vector时遇到崩溃其中T显然是不可move的(没有定义move构造函数/赋值运算符,它包含内部指针)但为什么vector的move函数要调用T的move函数??应该没有必要。所以我的问题来自标题:是std::vector如果T可move不可move? 最佳答案 是的,std::vector即使T也是可move的不可move。左侧仅从右侧的vector中获取所有权,不涉及任何元素。(除了一个异常(exception),在#2中列出)vector的move分配只会调用T的move构造函数或move赋值如果和

C++11 左值、右值和 std::move()

我有以下代码:#includeusingnamespacestd;voidtest(int&a){cout哪些输出:lvalue.rvaluelvalue.lvalue.std::move()和int&&是右值引用,我想知道为什么test(std::move(a))和test(b)输出左值?与签名匹配和函数重载有关吗? 最佳答案 输出应该是:lvalue.rvaluervaluelvalue.右值表达式和右值引用类型的表达式之间有一个非常重要的区别。b的类型是对int的右值引用,但表达式b是左值;它是一个变量,你可以取它的地址。这就