Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11中高效的算术运算符重载_C++_C++11_Operator Overloading_Rvalue Reference_Move Semantics - Fatal编程技术网

C++11中高效的算术运算符重载

C++11中高效的算术运算符重载,c++,c++11,operator-overloading,rvalue-reference,move-semantics,C++,C++11,Operator Overloading,Rvalue Reference,Move Semantics,我有一个POD结构,它有许多成员,我想知道C++11中实现算术运算符的最有效方法 该结构用于在数学上下文中替代原语;例如: 样板 双倍计程仪双倍与d0、双倍与d1、双倍与d2 { 返回d0*d1+3*d2-6; } 其中,Double要么只是普通的Double,要么是包含所有相关重载运算符的POD结构: 结构MyDouble { MyDoubleA,DoubleB:aa,bb{} 双a; 双b; }; MyDouble运算符+常量MyDouble和d0、常量MyDouble和d1 { 返回MyD

我有一个POD结构,它有许多成员,我想知道C++11中实现算术运算符的最有效方法

该结构用于在数学上下文中替代原语;例如:

样板 双倍计程仪双倍与d0、双倍与d1、双倍与d2 { 返回d0*d1+3*d2-6; } 其中,Double要么只是普通的Double,要么是包含所有相关重载运算符的POD结构:

结构MyDouble { MyDoubleA,DoubleB:aa,bb{} 双a; 双b; }; MyDouble运算符+常量MyDouble和d0、常量MyDouble和d1 { 返回MyDoubled0.\u a+d1.\u a,d0.\u b+d1.\u b; } 在C++11中,是否有一种使用移动构造函数和右值引用的非常好、有效的方法来实现这一点?请记住,MyDouble可以是一个大的POD结构,即不仅仅是两个Double

我想继续讨论没有指向堆分配内存的指针的结构。

如果结构不拥有任何其他对象或资源,那么移动语义和复制语义是相同的。即使是移动构造函数或移动赋值操作符也需要将所有数据成员复制到目标对象。它不需要执行深度复制,即拥有的子对象只需传输到目标对象,而不是被复制

如果您的结构非常庞大,您可以创建一个holder类型,其中包含一个指向堆分配实例的指针,最好使用scoped_ptr。然后,您可以支持该持有者类型上的移动—实际上,如果您使用scoped_ptr管理实际实例,我认为您将自动获得移动支持。

如果一个结构不拥有任何其他对象或资源,那么移动语义和复制语义是相同的。即使是移动构造函数或移动赋值操作符也需要将所有数据成员复制到目标对象。它不需要执行深度复制,即拥有的子对象只需传输到目标对象,而不是被复制


如果您的结构非常庞大,您可以创建一个holder类型,其中包含一个指向堆分配实例的指针,最好使用scoped_ptr。然后,您就可以支持该holder类型上的move-实际上,如果您使用scoped_ptr管理实际实例,我认为您将自动获得move支持。

如果所有内存都包含在结构本身中,move构造函数实际上不会为您做任何事情,但是您仍然有返回值优化,这可能会使隐含副本变得不必要。返回值优化是我应该控制的东西,即我需要编写一些代码,还是在编译器优化领域?这是一个编译器优化。用简单而明显的方法进行优化到底有什么低效之处?您是否有分析数据表明它效率低下?@user1487088:为什么不问问移动语义是如何工作的?或者更好的是,查找关于移动语义如何工作的现有问题。如果所有内存都包含在结构本身中,那么移动构造函数实际上不会为您做任何事情,但是您仍然有返回值优化,这可能会使隐含副本变得不必要。返回值优化是我应该控制的东西,即我需要编写一些代码,还是在编译器优化领域?这是一个编译器优化。用简单而明显的方法进行优化到底有什么低效之处?您是否有分析数据表明它效率低下?@user1487088:为什么不问问移动语义是如何工作的?或者更好的是,查找关于移动语义如何工作的现有问题。