草庐IT

nothrow_move_constructible

全部标签

c++ - (缺少)使用 C++11 move 语义的性能改进

我已经编写C++11代码很长一段时间了,还没有对其进行任何基准测试,只期望像vector操作这样的东西现在可以通过move语义“更快”。因此,当实际使用GCC4.7.2和clang3.0(Ubuntu12.1064位的默认编译器)进行基准测试时,我得到了非常不满意的结果。这是我的测试代码:编辑:关于@DeadMG和@ronag发布的(好的)答案,我将元素类型从std::string更改了。至my::string没有swap(),并使所有内部字符串变大(200-700字节),这样它们就不会成为SSO的受害者。EDIT2:原因是奶牛。由伟大的评论再次改编代码,从std::string更改存

c++ - 按值返回时,值参数是否隐式 move ?

考虑以下函数:Foofoo(Foox){returnx;}returnx会调用复制构造函数还是move构造函数?(让我们把NRVO放在一边。)为了调查,我写了一个简单的Foo类,它只能move但不能复制:structFoo{Foo()=default;Foo(constFoo&)=delete;Foo(Foo&&)=default;};如果在按值返回值参数时调用了move构造函数,一切都应该没问题。但是当前的g++编译器提示returnx并带有以下错误消息:error:deletedfunction'Foo::Foo(constFoo&)'如果我将returnx替换为returnstd

c++ - 按值返回时,值参数是否隐式 move ?

考虑以下函数:Foofoo(Foox){returnx;}returnx会调用复制构造函数还是move构造函数?(让我们把NRVO放在一边。)为了调查,我写了一个简单的Foo类,它只能move但不能复制:structFoo{Foo()=default;Foo(constFoo&)=delete;Foo(Foo&&)=default;};如果在按值返回值参数时调用了move构造函数,一切都应该没问题。但是当前的g++编译器提示returnx并带有以下错误消息:error:deletedfunction'Foo::Foo(constFoo&)'如果我将returnx替换为returnstd

c++ - 对象传递给 std::move 但未从中移出?

我正在审查一些这样的代码,其中A是可移动类型://ReturnstrueexactlywhenownershipofaistakenboolMaybeConsume(A&&a){if(somecondition){Consume(std::move(a));//???returntrue;}returnfalse;}//...elsewhere...Aa;if(!MaybeConsume(std::move(a))){a.DoSomething();//!!!}我们的静态分析工具提示a在被移动后被使用(在!!!处)。IIUCstd::move只是一个static_cast,对象a直到调

c++ - 对象传递给 std::move 但未从中移出?

我正在审查一些这样的代码,其中A是可移动类型://ReturnstrueexactlywhenownershipofaistakenboolMaybeConsume(A&&a){if(somecondition){Consume(std::move(a));//???returntrue;}returnfalse;}//...elsewhere...Aa;if(!MaybeConsume(std::move(a))){a.DoSomething();//!!!}我们的静态分析工具提示a在被移动后被使用(在!!!处)。IIUCstd::move只是一个static_cast,对象a直到调

c++ - is_trivially_copyable 和 is_trivially_copy_constructible 有什么区别?

这些何时会给出不同的答案,这种差异何时有用(如果有的话)? 最佳答案 前者测试triviallycopyable属性,简而言之,这意味着该类型是memcpy-安全的。Atriviallycopyableclassisaclassthat:—hasnonon-trivialcopyconstructors(12.8),—hasnonon-trivialmoveconstructors(12.8),—hasnonon-trivialcopyassignmentoperators(13.5.3,12.8),—hasnonon-trivia

c++ - is_trivially_copyable 和 is_trivially_copy_constructible 有什么区别?

这些何时会给出不同的答案,这种差异何时有用(如果有的话)? 最佳答案 前者测试triviallycopyable属性,简而言之,这意味着该类型是memcpy-安全的。Atriviallycopyableclassisaclassthat:—hasnonon-trivialcopyconstructors(12.8),—hasnonon-trivialmoveconstructors(12.8),—hasnonon-trivialcopyassignmentoperators(13.5.3,12.8),—hasnonon-trivia

c++ - Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语?

如thisanswer中所述,copy-and-swap习语的实现方式如下:classMyClass{private:BigClassdata;UnmovableClass*dataPtr;public:MyClass():data(),dataPtr(newUnmovableClass){}MyClass(constMyClass&other):data(other.data),dataPtr(newUnmovableClass(*other.dataPtr)){}MyClass(MyClass&&other):data(std::move(other.data)),dataPtr(

c++ - Copy-and-Swap 成语是否应该成为 C++11 中的 Copy-and-Move 成语?

如thisanswer中所述,copy-and-swap习语的实现方式如下:classMyClass{private:BigClassdata;UnmovableClass*dataPtr;public:MyClass():data(),dataPtr(newUnmovableClass){}MyClass(constMyClass&other):data(other.data),dataPtr(newUnmovableClass(*other.dataPtr)){}MyClass(MyClass&&other):data(std::move(other.data)),dataPtr(

c++ - 为什么 std::move 之后的析构函数调用是必要的?

在C++编程语言第4版中有一个vector实现的示例,请参阅消息末尾的相关代码。uninitialized_move()通过将新的T对象从旧的内存区域中移出来将它们初始化到新的内存区域中。然后它调用原始T对象(即移出对象)的析构函数。为什么在这种情况下需要调用析构函数?这里是我的不完全理解:move一个对象是指将被move对象所拥有的资源的所有权转移到被move对象。move对象中的剩余部分是不需要销毁的内置类型的一些可能成员,当vector_baseb超出范围时(在reserve()内),它们将被释放,在swap()调用之后)。被move对象中的所有指针都将被放置到nullptr或者