jjzjj

move-semantics

全部标签

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++ - 这个表达式是左值还是右值?

看看这个表达式:Tt;T&ref=t;ref表达式是左值还是右值?我相信它是右值因为ref没有“指定函数或对象”:"Anlvalue(socalled,historically,becauselvaluescouldappearontheleft-handsideofanassignmentexpression)designatesafunctionoranobject."[开放标准草案n3092]根据cppreference,引用不是对象。"Thefollowingentitiesarenotobjects:value,reference[...]"我有疑问,因为ref在=的左侧。

【论文笔记】《Learning Deconvolution Network for Semantic Segmentation》

重要说明:严格来说,论文所指的反卷积并不是真正的deconvolutionnetwork。关于deconvolutionnetwork的详细介绍,请参考另一篇博客:什么是DeconvolutionalNetwork?一、参考资料LearningDeconvolutionNetworkforSemanticSegmentation二、DeconvolutionNetworkdeconvolutionnetwork是卷积网络(convolutionnetwork)的镜像,由反卷积层(deconvolutionallayers)和上采样层(Unpoolinglayers)组成。本质上,deconvo

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是左值;它是一个变量,你可以取它的地址。这就

c++ - move 语义只是一个浅拷贝并将其他指针设置为空吗?

我一直在阅读C++中的move语义,在解释中人们给出了很多类比来帮助简化它,在我的脑海中我能看到的是人们所说的“move”而不是“复制”“只是对象的浅表拷贝,并将“移出”对象中的任何指针设置为空。这基本上是要点吗?浅拷贝并将其他指针设置为空? 最佳答案 Shallowcopyandsetother'spointerstonull?浅拷贝-是的。将其他人的指针设置为null-并非总是如此。最低要求是被移出的对象处于“未定义但有效的状态”,也就是说你可以重新分配给它,再次move它或删除它而不会导致程序失败,但不执行其他状态相关的操作。

c++ - 我可以调整从中移出的 vector 的大小吗?

我有一些代码,我想在其中绝对确保移出的std::vector不会留下secret数据(考虑加密key管理)。在我类(class)的move构造函数中,我做了类似的事情:X(X&&rhs):secret_vector{std::move(rhs.secret_vector)}{rhs.secret_vector.resize(N);safe_zero(rhs.secret_vector);//zerooutallelementsrhs.secret_vector.resize(0);}如您所见,我在move后重新使用了secretvector。我看着Reusingamovedcontai

c++ - 为什么没有 std::move_if 算法?

我在Internet上看到一些地方描述了将std::copy_if与std::make_move_iterator一起使用,但是如果迭代器是前向的迭代器,这将导致在源容器周围散布有效但未指定(VBU)的对象。如果有一个std::move_if算法会不会更好,如果一个对象被移动,那么它会将生成的VBU对象移动到范围的末尾,就像那个是在std::remove_if算法中完成的,将所有VBU对象合并在一起,以便它们可以被删除或重新分配? 最佳答案 如果move_if作为算法存在,则必须指定为:templateOutputItmove_if

C++ std::move 混淆

我对以下代码片段中发生的事情感到困惑。是move这里真的有必要吗?返回临时集的最佳且安全的方式是什么?setgetWords(){setwords;for(autoiter=wordIndex.begin();iter!=wordIndex.end();++iter){words.insert(iter->first);}returnmove(words);}我的调用代码只是执行setwords=foo.getWords() 最佳答案 首先,集合不是临时,而是本地。其次,返回它的正确方法是通过returnwords;。这不仅是您允许